/ Hex Artifact Content
Login

Artifact 6f94e30c50551c58df1fd61e608454d2463809d5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
3ac0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
3ad0: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
3ae0: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
3af0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3b00: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
3b10: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3b20: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
3b30: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
3b40: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
3b50: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
3b60: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
3b70: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
3b80: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
3b90: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
3ba0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
3bb0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
3bc0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3bd0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3bf0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3c00: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3c10: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3c20: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3c30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3c40: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3c50: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3c60: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3c70: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3c80: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3c90: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ca0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3cb0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3cc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3cd0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
3ce0: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
3cf0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
3d00: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
3d10: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
3d20: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
3d30: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
3d40: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
3d50: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
3d60: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
3d70: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
3d80: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
3d90: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
3da0: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
3db0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
3dc0: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
3dd0: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
3de0: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
3df0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
3e00: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
3e10: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
3e20: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
3e30: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
3e40: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
3e50: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
3e60: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
3e80: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
3e90: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
3ea0: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
3eb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ec0: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
3ed0: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
3ee0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3ef0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
3f00: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
3f10: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
3f20: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
3f30: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
3f40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
3f50: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
3f60: 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52  heck */.  i64 iR
3f70: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
3f80: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
3f90: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
3fa0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
3fb0: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
3fc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
3fd0: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
3fe0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
3ff0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
4000: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
4010: 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61  pBtree->pBt;.  a
4020: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
4030: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
4040: 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
4050: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
4060: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4070: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
4080: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
4090: 6c 6f 62 29 21 3d 30 20 26 26 20 28 69 73 43 6c  lob)!=0 && (isCl
40a0: 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69  earTable || p->i
40b0: 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20  nfo.nKey==iRow) 
40c0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40e0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
40f0: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4100: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4110: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4120: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4130: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4140: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4150: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4160: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4170: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4180: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
4190: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41a0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41b0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41c0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41d0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41e0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
41f0: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4200: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4210: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4220: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4230: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4240: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4250: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4260: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4270: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4280: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
4290: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42a0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42b0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42c0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42d0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42e0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
42f0: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4300: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4310: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4320: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4330: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4340: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4350: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4360: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4370: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4380: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
4390: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43a0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43b0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43c0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43d0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43e0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
43f0: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4400: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4410: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4420: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4430: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4440: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4450: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4460: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4480: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
4490: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44a0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44b0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44c0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44d0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44e0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
44f0: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4500: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4510: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4520: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4530: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4540: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4550: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4560: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4570: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4580: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
4590: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45a0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45b0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45d0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45e0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
45f0: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4600: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4610: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4620: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4630: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4640: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4650: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4660: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4670: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4680: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
4690: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46a0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46b0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46c0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46d0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46e0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
46f0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4700: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4710: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4720: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4730: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4740: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4750: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4760: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4770: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4780: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
4790: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47a0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47b0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47c0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47d0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47e0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
47f0: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4800: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4810: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4820: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4830: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4840: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4850: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4860: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4870: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4880: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4890: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48b0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48c0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48e0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
48f0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4900: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4910: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4920: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4930: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4940: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4950: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4980: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4990: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49a0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49c0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49d0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
49f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4a90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4aa0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ab0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ac0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ad0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ae0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4af0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4b90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4ba0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bc0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4bd0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4be0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4bf0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4c90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4cd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4ce0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4cf0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d00: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d10: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d30: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d40: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d50: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d60: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d70: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d80: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4d90: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4da0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4db0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dc0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4dd0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4de0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4df0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e00: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e10: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e20: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e30: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e40: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e50: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e60: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e70: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e80: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4e90: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4ea0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4eb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ec0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ed0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ee0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4ef0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f00: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f10: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f20: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f30: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f50: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f60: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f80: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4f90: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fa0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fb0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fc0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fd0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4fe0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
4ff0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5000: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5010: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5020: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5030: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5040: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5050: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5060: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5070: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5080: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
5090: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50a0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50b0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50c0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50d0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50e0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
50f0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5100: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5110: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
5120: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5130: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5140: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5150: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5160: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5170: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5180: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5190: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
51a0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
51b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
51c0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
51d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
51e0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
51f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5200: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5210: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
5220: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5230: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5250: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5260: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5270: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5280: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5290: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
52a0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
52b0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
52c0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
52d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
52e0: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
52f0: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28  of all cursors (
5300: 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29 20  except pExcept) 
5310: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
5320: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20 77  .** the table  w
5330: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
5340: 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68  oot. Usually, th
5350: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  is is called jus
5360: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a  t before cursor.
5370: 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73  ** pExcept is us
5380: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
5390: 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c   table (BtreeDel
53a0: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
53b0: 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  sert())..*/.stat
53c0: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
53d0: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
53e0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
53f0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
5400: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
5410: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
5420: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5430: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5440: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
5450: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
5460: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
5470: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
5480: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
5490: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
54a0: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
54b0: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
54c0: 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20  t==iRoot) ){.   
54d0: 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
54e0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
54f0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  {.        int rc
5500: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5510: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5520: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5530: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =rc ){.         
5540: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
5550: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
5560: 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e{.        testc
5570: 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20  ase( p->iPage>0 
5580: 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  );.        btree
5590: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
55a0: 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20  Pages(p);.      
55b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
55c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
55d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
55e0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
55f0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
5600: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
5610: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
5620: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
5630: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5640: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5650: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5660: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
5670: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5680: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5690: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
56a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
56b0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
56c0: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
56d0: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
56e0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
56f0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
5700: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
5710: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
5720: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
5730: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
5740: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
5750: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
5760: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
5770: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
5780: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
5790: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
57a0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
57b0: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
57c0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
57d0: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
57e0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
57f0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
5800: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
5810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
5820: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
5830: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
5840: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
5850: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
5860: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
5870: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
5880: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
5890: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
58a0: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
58b0: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
58c0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
58f0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
5900: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
5910: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
5920: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
5930: 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20  aSpace[200];    
5940: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
5950: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
5960: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
5970: 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  loc */.  char *p
5980: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Free = 0;..  if(
5990: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
59a0: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
59b0: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
59c0: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
59d0: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
59e0: 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
59f0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66     pCur->pKeyInf
5a00: 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f  o, aSpace, sizeo
5a10: 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65  f(aSpace), &pFre
5a20: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
5a30: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
5a40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5a50: 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  M;.    sqlite3Vd
5a60: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
5a70: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
5a80: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
5a90: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
5aa0: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
5ab0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
5ac0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72  lite3DbFree(pCur
5ad0: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
5ae0: 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  pFree);.      re
5af0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
5b00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
5b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
5b20: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
5b30: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5b40: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
5b50: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
5b60: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
5b70: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
5b80: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5b90: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
5ba0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
5bb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
5bd0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
5be0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
5bf0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
5c00: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
5c10: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
5c20: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5c30: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
5c40: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
5c50: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
5c60: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
5c70: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
5c80: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5c90: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
5ca0: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
5cb0: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
5cc0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5cd0: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
5ce0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
5cf0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
5d00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5d10: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
5d20: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
5d30: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
5d40: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
5d50: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5d60: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
5d70: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
5d80: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5d90: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
5da0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5db0: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
5dc0: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
5dd0: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
5de0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5df0: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
5e00: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
5e10: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
5e20: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
5e30: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20  ur->skipNext);. 
5e40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5e50: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
5e60: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
5e70: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
5e80: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
5e90: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5ea0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
5eb0: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
5ec0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
5ed0: 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
5ee0: 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72  skipNext && pCur
5ef0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5f00: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  _VALID ){.      
5f10: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5f20: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a  URSOR_SKIPNEXT;.
5f30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5f40: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
5f50: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
5f60: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
5f70: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
5f80: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
5f90: 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65  \.         btree
5fa0: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
5fb0: 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20  ition(p) : \.   
5fc0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29        SQLITE_OK)
5fd0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
5fe0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
5ff0: 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f   a cursor has mo
6000: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  ved from the pos
6010: 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20  ition it.** was 
6020: 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20  last placed at. 
6030: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
6040: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
6050: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
6060: 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74 65  .** at is delete
6070: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
6080: 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   them..**.** Thi
6090: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
60a0: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  s an error code 
60b0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
60c0: 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a  s wrong.  The.**
60d0: 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d 6f   integer *pHasMo
60e0: 76 65 64 20 69 73 20 73 65 74 20 61 73 20 66 6f  ved is set as fo
60f0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
6100: 30 3a 20 20 20 54 68 65 20 63 75 72 73 6f 72 20  0:   The cursor 
6110: 69 73 20 75 6e 63 68 61 6e 67 65 64 0a 2a 2a 20  is unchanged.** 
6120: 20 20 20 31 3a 20 20 20 54 68 65 20 63 75 72 73     1:   The curs
6130: 6f 72 20 69 73 20 73 74 69 6c 6c 20 70 6f 69 6e  or is still poin
6140: 74 69 6e 67 20 61 74 20 74 68 65 20 73 61 6d 65  ting at the same
6150: 20 72 6f 77 2c 20 62 75 74 20 74 68 65 20 70 6f   row, but the po
6160: 69 6e 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  inters.**       
6170: 20 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71    returned by sq
6180: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
6190: 63 68 28 29 20 6f 72 20 73 71 6c 69 74 65 33 42  ch() or sqlite3B
61a0: 74 72 65 65 44 61 74 61 46 65 74 63 68 28 29 0a  treeDataFetch().
61b0: 2a 2a 20 20 20 20 20 20 20 20 20 6d 69 67 68 74  **         might
61c0: 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
61d0: 62 65 63 61 75 73 65 20 6f 66 20 61 20 62 61 6c  because of a bal
61e0: 61 6e 63 65 28 29 20 6f 72 20 6f 74 68 65 72 20  ance() or other 
61f0: 63 68 61 6e 67 65 20 74 6f 20 74 68 65 0a 2a 2a  change to the.**
6200: 20 20 20 20 20 20 20 20 20 62 2d 74 72 65 65 2e           b-tree.
6210: 0a 2a 2a 20 20 20 20 32 3a 20 20 20 54 68 65 20  .**    2:   The 
6220: 63 75 72 73 6f 72 20 69 73 20 6e 6f 20 6c 6f 6e  cursor is no lon
6230: 67 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ger pointing to 
6240: 74 68 65 20 72 6f 77 2e 20 20 54 68 65 20 72 6f  the row.  The ro
6250: 77 20 6d 69 67 68 74 20 68 61 76 65 0a 2a 2a 20  w might have.** 
6260: 20 20 20 20 20 20 20 20 62 65 65 6e 20 64 65 6c          been del
6270: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
6280: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  der the cursor..
6290: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
62a0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
62b0: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
62c0: 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64  , int *pHasMoved
62d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
62e0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
62f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6300: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
6310: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
6320: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
6330: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
6340: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
6350: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
6360: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
6370: 20 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   2;.    return r
6380: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
6390: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
63a0: 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45 52  R_VALID || NEVER
63b0: 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21  (pCur->skipNext!
63c0: 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 48 61 73  =0) ){.    *pHas
63d0: 4d 6f 76 65 64 20 3d 20 32 3b 0a 20 20 7d 65 6c  Moved = 2;.  }el
63e0: 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76  se{.    *pHasMov
63f0: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ed = 1;.  }.  re
6400: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6410: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6420: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6430: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
6440: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
6450: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
6460: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
6470: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
6480: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
6490: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
64a0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
64b0: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
64c0: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
64d0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
64e0: 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67  (not a valid pag
64f0: 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73  e) for pgno==1 s
6500: 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  ince there is.**
6510: 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   no pointer map 
6520: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6530: 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74  page 1.  The int
6540: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67  egrity_check log
6550: 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74  ic.** requires t
6560: 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  hat ptrmapPageno
6570: 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61  (*,1)!=1..*/.sta
6580: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
6590: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
65a0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
65b0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
65c0: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
65d0: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
65e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
65f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
6600: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
6610: 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20  pgno<2 ) return 
6620: 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  0;.  nPagesPerMa
6630: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
6640: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
6650: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
6660: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
6670: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
6680: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
6690: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
66a0: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
66b0: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
66c0: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
66d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
66e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
66f0: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
6700: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6710: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6720: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
6730: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6740: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
6750: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
6760: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
6770: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
6780: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
6790: 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  'pgno'..**.** If
67a0: 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c   *pRC is initial
67b0: 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e  ly non-zero (non
67c0: 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e  -SQLITE_OK) then
67d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
67e0: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66  .** a no-op.  If
67f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6800: 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  , the appropriat
6810: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
6820: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
6830: 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  *pRC..*/.static 
6840: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42  void ptrmapPut(B
6850: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6860: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
6870: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69  , Pgno parent, i
6880: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61  nt *pRC){.  DbPa
6890: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
68a0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
68b0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
68c0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
68d0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
68e0: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
68f0: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
6900: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
6910: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
6920: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
6930: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
6940: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6950: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
6960: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
6970: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
6980: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
6990: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
69a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
69b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
69c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
69d0: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
69e0: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
69f0: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
6a00: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
6a10: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6a20: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
6a30: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
6a40: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
6a50: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
6a60: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
6a70: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
6a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
6a90: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6aa0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
6ab0: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
6ac0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6ad0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6ae0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6af0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6b00: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6b10: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
6b20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
6b30: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
6b40: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
6b50: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6b60: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6b70: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6b80: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
6b90: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6ba0: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
6bb0: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
6bc0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
6bd0: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
6be0: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
6bf0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
6c00: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
6c10: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
6c20: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
6c30: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
6c40: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
6c50: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
6c60: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
6c70: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
6c80: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
6c90: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
6ca0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
6cb0: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
6cc0: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
6cd0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
6ce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6cf0: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
6d00: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
6d10: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
6d20: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
6d30: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
6d40: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
6d50: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
6d60: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
6d70: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
6d80: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
6d90: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
6da0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
6db0: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
6dc0: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
6dd0: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
6de0: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
6df0: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
6e00: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
6e10: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
6e20: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
6e30: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
6e40: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
6e50: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
6e60: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
6e70: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
6e80: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
6e90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6ea0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
6eb0: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
6ec0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6ed0: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
6ee0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6ef0: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
6f00: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
6f10: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
6f20: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
6f30: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6f40: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
6f50: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
6f60: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
6f70: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
6f80: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
6f90: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
6fa0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6fb0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6fc0: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
6fd0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
6fe0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
6ff0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7000: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7010: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
7020: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
7030: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
7040: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
7050: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
7060: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
7070: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
7080: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
7090: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
70a0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
70b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
70c0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
70d0: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
70e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
70f0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
7100: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
7110: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
7120: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
7130: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
7140: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
7150: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
7160: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
7170: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
7180: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
7190: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
71a0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
71b0: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
71c0: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
71d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
71e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
71f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7200: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
7210: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
7220: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
7230: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
7240: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
7250: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
7260: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
7270: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
7280: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
7290: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
72a0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
72b0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
72c0: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
72d0: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
72e0: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
72f0: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
7300: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
7310: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
7320: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7330: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
7340: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
7350: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
7360: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
7370: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
7380: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
7390: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
73a0: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
73b0: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
73c0: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
73d0: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65 6c  2byte(&(P)->aCel
73e0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
73f0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 76  define findCellv
7400: 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d  2(D,M,O,I) (D+(M
7410: 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b 32  &get2byte(D+(O+2
7420: 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I))))).../*.**
7430: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
7440: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
7450: 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  findCell() that 
7460: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
7470: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
7480: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
7490: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
74a0: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
74b0: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
74c0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
74d0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
74e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
74f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
7500: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
7510: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
7520: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
7530: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
7540: 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f 76   k = pPage->aiOv
7550: 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 6b  fl[i];.    if( k
7560: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
7570: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
7580: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7590: 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69 5d  pPage->apOvfl[i]
75a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
75b0: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
75c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
75d0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
75e0: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
75f0: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
7600: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
7610: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
7620: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
7630: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
7640: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
7650: 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50  unction.  btreeP
7660: 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73  arseCell() takes
7670: 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65   a .** cell inde
7680: 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  x as the second 
7690: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72  argument and btr
76a0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
76b0: 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69   .** takes a poi
76c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79  nter to the body
76d0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
76e0: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
76f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  ent..**.** Withi
7700: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
7710: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63   parseCell() mac
7720: 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ro can be called
7730: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
7740: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7750: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
7760: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
7770: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
7780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
7790: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
77a0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
77b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
77c0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
77d0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
77e0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
77f0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7800: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
7810: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
7820: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7830: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
7840: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
7850: 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u16 n;          
7860: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7870: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
7880: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
7890: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
78b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
78c0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
78d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
78e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
78f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
7900: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
7910: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
7920: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7930: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
7940: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
7950: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
7960: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
7970: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
7980: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
7990: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
79a0: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
79b0: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 61  sData ){.      a
79c0: 73 73 65 72 74 28 20 6e 3d 3d 30 20 29 3b 0a 20  ssert( n==0 );. 
79d0: 20 20 20 20 20 6e 20 3d 20 67 65 74 56 61 72 69       n = getVari
79e0: 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79  nt32(pCell, nPay
79f0: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  load);.    }else
7a00: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
7a10: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7a20: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
7a30: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29  pCell[n], (u64*)
7a40: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
7a50: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
7a60: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  = nPayload;.  }e
7a70: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
7a80: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e  nData = 0;.    n
7a90: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7aa0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
7ab0: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
7ac0: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
7ad0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
7ae0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
7af0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
7b00: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74  ader = n;.  test
7b10: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
7b20: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
7b30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
7b40: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
7b50: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7b60: 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c  if( likely(nPayl
7b70: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
7b80: 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
7b90: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
7ba0: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
7bb0: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
7bc0: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
7bd0: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
7be0: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
7bf0: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
7c00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7c10: 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20  (pInfo->nSize = 
7c20: 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61 64  (u16)(n+nPayload
7c30: 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ))<4 ) pInfo->nS
7c40: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
7c50: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
7c60: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
7c70: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7c80: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7c90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
7ca0: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
7cb0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
7cc0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
7cd0: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
7ce0: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
7cf0: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
7d00: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
7d10: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
7d20: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
7d30: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
7d40: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
7d50: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
7d60: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
7d70: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
7d80: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
7d90: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
7da0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
7db0: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
7dc0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
7dd0: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
7de0: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
7df0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
7e00: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
7e10: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
7e20: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
7e30: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
7e40: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
7e50: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
7e60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
7e70: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
7e80: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
7e90: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
7ea0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
7eb0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
7ec0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
7ed0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
7ee0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
7ef0: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
7f00: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
7f10: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
7f20: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
7f30: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
7f40: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
7f50: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
7f60: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
7f70: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
7f80: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
7f90: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
7fa0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
7fb0: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
7fc0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
7fd0: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
7fe0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
7ff0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8000: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
8010: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
8020: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
8030: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
8040: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
8050: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
8060: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8070: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
8080: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8090: 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e   = (u16)(pInfo->
80a0: 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20  nLocal + n);.   
80b0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
80c0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
80d0: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66   + 4;.  }.}.#def
80e0: 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ine parseCell(pP
80f0: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
8100: 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73  o) \.  btreePars
8110: 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29  eCellPtr((pPage)
8120: 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67  , findCell((pPag
8130: 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70  e), (iCell)), (p
8140: 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f  Info)).static vo
8150: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8160: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
8170: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8180: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8190: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
81a0: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
81b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
81c0: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
81d0: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
81e0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
81f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8200: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8210: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
8220: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
8230: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
8240: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
8250: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
8260: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
8270: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
8280: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
8290: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
82a0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
82b0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
82c0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
82d0: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
82e0: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
82f0: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
8300: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
8310: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
8320: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
8330: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
8340: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
8350: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
8360: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
8370: 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67  er = &pCell[pPag
8380: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
8390: 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a  ;.  u32 nSize;..
83a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
83b0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
83c0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
83d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
83e0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
83f0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
8400: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
8410: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
8420: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
8430: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
8440: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
8450: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
8460: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
8470: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
8480: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
8490: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
84a0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
84b0: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
84c0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
84d0: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72  debuginfo;.  btr
84e0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
84f0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
8500: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
8510: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ..  if( pPage->i
8520: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20  ntKey ){.    u8 
8530: 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  *pEnd;.    if( p
8540: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
8550: 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  .      pIter += 
8560: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
8570: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d  r, nSize);.    }
8580: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a  else{.      nSiz
8590: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
85a0: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
85b0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
85c0: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
85d0: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
85e0: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
85f0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
8600: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
8610: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
8620: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
8630: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
8640: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8650: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
8660: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8670: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8680: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8690: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
86a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
86b0: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
86c0: 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b  2(pIter, nSize);
86d0: 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65  .  }..  testcase
86e0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
86f0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
8700: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8710: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
8720: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e   );.  if( nSize>
8730: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8740: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  ){.    int minLo
8750: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
8760: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
8770: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
8780: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
8790: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
87a0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
87b0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
87c0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
87d0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
87e0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
87f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8800: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
8810: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
8820: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
8830: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
8840: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
8850: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d  ;.  }.  nSize +=
8860: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
8870: 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Cell);..  /* The
8880: 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
8890: 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62   any cell is 4 b
88a0: 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  ytes. */.  if( n
88b0: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53  Size<4 ){.    nS
88c0: 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  ize = 4;.  }..  
88d0: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
88e0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29  ebuginfo.nSize )
88f0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
8900: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66  nSize;.}..#ifdef
8910: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
8920: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
8930: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
8940: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
8950: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
8960: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
8970: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
8980: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
8990: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
89a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c  ){.  return cell
89b0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66  SizePtr(pPage, f
89c0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
89d0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
89e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
89f0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8a00: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
8a10: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
8a20: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
8a30: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
8a40: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
8a50: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
8a60: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
8a70: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
8a80: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
8a90: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
8aa0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
8ab0: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
8ac0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8ad0: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
8ae0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
8af0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8b00: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
8b10: 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65  ll!=0 );.  btree
8b20: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
8b30: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
8b40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
8b50: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
8b60: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
8b70: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
8b80: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e  load );.  if( in
8b90: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
8ba0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
8bb0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
8bc0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
8bd0: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
8be0: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
8bf0: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
8c00: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
8c10: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
8c20: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
8c30: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
8c40: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
8c50: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
8c60: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
8c70: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
8c80: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
8c90: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
8ca0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
8cb0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
8cc0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
8cd0: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
8ce0: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
8cf0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8d00: 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rea..*/.static i
8d10: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
8d20: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8d30: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8d60: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
8d90: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
8da0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
8db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8dc0: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
8dd0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
8de0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
8df0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8e00: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
8e10: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
8e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8e30: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
8e40: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
8e50: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
8e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8e70: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
8e80: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
8e90: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8ec0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8ed0: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
8ee0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8ef0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8f00: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
8f10: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
8f20: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
8f30: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
8f40: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
8f50: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
8f60: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
8f70: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
8f80: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
8f90: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
8fa0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
8fb0: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
8fc0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
8fd0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
8fe0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
8ff0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
9000: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9010: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9020: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9030: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
9040: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
9050: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9060: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9070: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
9080: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
9090: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
90a0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
90b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
90c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
90d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
90e0: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
90f0: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
9100: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
9110: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
9120: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
9130: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
9140: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
9150: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
9160: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
9170: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
9180: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
9190: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
91a0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
91b0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
91c0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
91d0: 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
91e0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
91f0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
9200: 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  p[cbrk], &data[c
9210: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
9220: 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b   - cbrk);.  cbrk
9230: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
9240: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
9250: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
9260: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
9270: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
9280: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
9290: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
92a0: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
92b0: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
92c0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
92d0: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
92e0: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
92f0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
9300: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65  e(pAddr);.    te
9310: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
9320: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
9330: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
9340: 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65  lLast );.#if !de
9350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9360: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
9370: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20  L_CHECK).    /* 
9380: 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  These conditions
9390: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
93a0: 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62  en verified in b
93b0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20  treeInitPage(). 
93c0: 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f     ** if SQLITE_
93d0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
93e0: 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65  CELL_CHECK is de
93f0: 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20  fined .    */.  
9400: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
9410: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
9420: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
9430: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9440: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
9450: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
9460: 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc>=iCellFirst
9470: 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73   && pc<=iCellLas
9480: 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  t );.    size = 
9490: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
94a0: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
94b0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
94c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
94d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
94e0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
94f0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
9500: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
9510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9520: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9530: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
9540: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
9550: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
9560: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
9570: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9580: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9590: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
95a0: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
95b0: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
95c0: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
95d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
95e0: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
95f0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
9600: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
9610: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
9620: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
9630: 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c  brk], &temp[pc],
9640: 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32   size);.    put2
9650: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
9660: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
9670: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
9680: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
9690: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
96a0: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
96b0: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
96c0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
96d0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
96e0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
96f0: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
9700: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
9710: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9720: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
9730: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9740: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
9750: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
9760: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
9770: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9780: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
9790: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
97a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
97b0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
97c0: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
97d0: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
97e0: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
97f0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
9800: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
9810: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
9820: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
9830: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
9840: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
9850: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
9860: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
9870: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
9880: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
9890: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
98a0: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
98b0: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
98c0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
98d0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
98e0: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
98f0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
9900: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
9910: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
9920: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
9930: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
9940: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
9950: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
9960: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
9970: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
9980: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
9990: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
99a0: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
99b0: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
99c0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
99d0: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
99e0: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
99f0: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
9a00: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
9a10: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
9a20: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
9a30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
9a40: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
9a50: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9a60: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
9a70: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
9a80: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
9a90: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
9aa0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
9ab0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
9ac0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
9ad0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9ae0: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
9af0: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
9b00: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  aData */.  int n
9b10: 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Frag;           
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61  /* Number of fra
9b40: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e  gmented bytes on
9b50: 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
9b60: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
9b90: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
9ba0: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  rea */.  int gap
9bb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
9bc0: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
9bd0: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
9be0: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
9bf0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tent */.  int rc
9c00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
9c10: 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
9c20: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
9c30: 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
9c40: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
9c50: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
9c60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
9c70: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
9c80: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
9c90: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9ca0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9cc0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9cd0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9ce0: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
9cf0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
9d00: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
9d10: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
9d20: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
9d30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
9d40: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75  erflow==0 );.  u
9d50: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
9d60: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9d70: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42  ze;.  assert( nB
9d80: 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65  yte < usableSize
9d90: 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  -8 );..  nFrag =
9da0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
9db0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9dc0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
9dd0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
9de0: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
9df0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9e00: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
9e10: 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  ell;.  top = get
9e20: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9e30: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
9e40: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
9e50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9e60: 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61  T_BKPT;.  testca
9e70: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
9e80: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
9e90: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
9ea0: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
9eb0: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67   );..  if( nFrag
9ec0: 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  >=60 ){.    /* A
9ed0: 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74  lways defragment
9ee0: 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74   highly fragment
9ef0: 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ed pages */.    
9f00: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
9f10: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
9f20: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9f30: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
9f40: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9f50: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d  ata[hdr+5]);.  }
9f60: 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c 3d  else if( gap+2<=
9f70: 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  top ){.    /* Se
9f80: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
9f90: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
9fa0: 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e  free slot big en
9fb0: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
9fc0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75  .    ** the requ
9fd0: 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74  est. The allocat
9fe0: 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d  ion is made from
9ff0: 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
a000: 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20  slot in .    ** 
a010: 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
a020: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
a030: 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 69 74 2e   accommodate it.
a040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
a050: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
a060: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
a070: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
a080: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
a090: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
a0a0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
a0b0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
a0c0: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
a0d0: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
a0e0: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61  leSize-4 || pc<a
a0f0: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  ddr+4 ){.       
a100: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a110: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a120: 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20     }.      size 
a130: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a140: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
a150: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
a160: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
a170: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
a180: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
a190: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
a1a0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
a1b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
a1c0: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x<4 ){.         
a1d0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
a1e0: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
a1f0: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
a200: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
a210: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
a220: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
a230: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
a240: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
a250: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61  &data[addr], &da
a260: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
a270: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
a280: 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b  ] = (u8)(nFrag +
a290: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   x);.        }el
a2a0: 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e  se if( size+pc >
a2b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
a2c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a2d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a2e0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
a2f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
a300: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
a310: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
a320: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
a330: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
a340: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
a350: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
a360: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
a370: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
a380: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a390: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
a3a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a3b0: 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b   *pIdx = pc + x;
a3c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a3d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
a3e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a3f0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
a400: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65   sure there is e
a410: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74  nough space in t
a420: 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66  he gap to satisf
a430: 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63  y.  ** the alloc
a440: 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20  ation.  If not, 
a450: 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f  defragment..  */
a460: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a470: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
a480: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
a490: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63  te>top ){.    rc
a4a0: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
a4b0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
a4c0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a4d0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a4e0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
a4f0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
a500: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
a510: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
a520: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
a530: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
a540: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a550: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a560: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
a570: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a580: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
a590: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
a5a0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
a5b0: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
a5c0: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
a5d0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
a5e0: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
a5f0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
a600: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
a610: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
a620: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a630: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
a640: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
a650: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
a660: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
a670: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
a680: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
a690: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
a6a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
a6b0: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
a6c0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a6d0: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
a6e0: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
a6f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a700: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
a710: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
a720: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
a730: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
a740: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a750: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
a760: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
a770: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
a780: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a790: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
a7a0: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
a7b0: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
a7c0: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
a7d0: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
a7e0: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
a7f0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
a800: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
a810: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
a820: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
a830: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a840: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a850: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a860: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74  egin, hdr;.  int
a870: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a890: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
a8a0: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
a8b0: 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  set */.  unsigne
a8c0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
a8d0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
a8e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a8f0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a900: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a910: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a920: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a930: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
a940: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
a950: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
a960: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
a970: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
a980: 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  ) <= (int)pPage-
a990: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a9a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a9b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a9c0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a9d0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a9e0: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
a9f0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
aa00: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66  ze is 4 */..  if
aa10: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
aa20: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
aa30: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
aa40: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
aa50: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
aa60: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
aa70: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
aa80: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
aa90: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
aaa0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
aab0: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
aac0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
aad0: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
aae0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
aaf0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
ab00: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
ab10: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
ab20: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
ab30: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
ab40: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
ab50: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
ab60: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
ab70: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
ab80: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
ab90: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
aba0: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
abb0: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
abc0: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
abd0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
abe0: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
abf0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
ac00: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
ac10: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
ac20: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
ac30: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
ac40: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
ac50: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
ac60: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
ac70: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
ac80: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
ac90: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
aca0: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
acb0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
acc0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
acd0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
ace0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
acf0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
ad00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
ad10: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
ad20: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
ad30: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
ad40: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
ad50: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
ad60: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
ad70: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
ad80: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
ad90: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ada0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
adb0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
adc0: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
add0: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
ade0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
adf0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
ae00: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
ae10: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
ae20: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
ae30: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
ae40: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ae50: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
ae60: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ae70: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ae80: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
ae90: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
aea0: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
aeb0: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
aec0: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
aed0: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
aee0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
aef0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
af00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
af10: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
af20: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
af30: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
af40: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
af50: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
af60: 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  n <= (int)pPage-
af70: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
af80: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
af90: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
afa0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
afb0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
afc0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
afd0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
afe0: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
aff0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
b000: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
b010: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
b020: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
b030: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
b040: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
b050: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
b060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b070: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b090: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
b0a0: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
b0b0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b0c0: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
b0d0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b0e0: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
b0f0: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
b100: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
b110: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
b120: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
b130: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
b140: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
b150: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
b160: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
b170: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
b180: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
b190: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
b1a0: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
b1b0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
b1c0: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
b1d0: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
b1e0: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
b1f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
b200: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
b210: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b220: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
b230: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
b240: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
b250: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
b260: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b270: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
b280: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
b290: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
b2a0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
b2b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
b2c0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
b2d0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
b2e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
b2f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b300: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
b310: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
b320: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
b330: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
b340: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
b350: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
b360: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
b370: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
b380: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
b390: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
b3a0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
b3b0: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
b3c0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
b3d0: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
b3e0: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
b3f0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
b400: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
b410: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
b420: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
b430: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
b440: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b450: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
b460: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b470: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
b480: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
b490: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
b4a0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
b4b0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
b4c0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b4d0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
b4e0: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
b4f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b500: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
b510: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b520: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
b530: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b540: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b550: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b560: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b570: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
b580: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
b590: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
b5a0: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
b5b0: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
b5c0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b5d0: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
b5e0: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
b5f0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
b600: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
b610: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b620: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
b630: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
b640: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b650: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
b660: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b670: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b680: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b690: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b6a0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
b6b0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
b6c0: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
b6d0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b6e0: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
b6f0: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
b700: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b710: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b720: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b730: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b740: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
b750: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b760: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b770: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
b780: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
b790: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b7a0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
b7b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b7c0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b7d0: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b7e0: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b7f0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
b800: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
b810: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
b820: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
b830: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
b840: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
b850: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
b860: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
b870: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
b880: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
b890: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
b8a0: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
b8b0: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
b8c0: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
b8d0: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
b8e0: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
b8f0: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
b900: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
b910: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
b920: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
b930: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
b940: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b950: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
b960: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b970: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b980: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b990: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b9a0: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
b9b0: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
b9c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b9d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b9e0: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b9f0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
ba00: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
ba10: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
ba20: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
ba30: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
ba40: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
ba50: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
ba60: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
ba70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ba80: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
ba90: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
baa0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
bab0: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
bac0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
bad0: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
bae0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
baf0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
bb00: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
bb10: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
bb20: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
bb30: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
bb40: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
bb50: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
bb60: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
bb70: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
bb80: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
bb90: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
bba0: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
bbb0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
bbc0: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
bbd0: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
bbe0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
bbf0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
bc00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
bc10: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
bc20: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
bc30: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
bc40: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
bc50: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
bc60: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
bc70: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
bc80: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
bc90: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
bca0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
bcb0: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
bcc0: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
bcd0: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
bce0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
bcf0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
bd00: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
bd10: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
bd20: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
bd30: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
bd40: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
bd50: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
bd60: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
bd70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
bd80: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
bd90: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
bda0: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
bdb0: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
bdc0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
bdd0: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
bde0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
bdf0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
be00: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
be10: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
be20: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
be30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
be40: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
be50: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
be60: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
be70: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
be80: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
be90: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
bea0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
beb0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
bec0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
bed0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
bee0: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
bef0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
bf00: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
bf10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
bf20: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
bf30: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
bf40: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
bf50: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
bf60: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
bf70: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
bf80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bf90: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bfa0: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
bfb0: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
bfc0: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
bfd0: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
bfe0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
bff0: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
c000: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
c010: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
c020: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
c030: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
c040: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
c050: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
c060: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
c070: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
c080: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
c090: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
c0a0: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
c0b0: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
c0c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
c0d0: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
c0e0: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
c0f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
c100: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
c110: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
c120: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
c130: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
c140: 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65   - 4;.#if define
c150: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
c160: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
c170: 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ECK).    {.     
c180: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c190: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
c1a0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
c1b0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
c1c0: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
c1d0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
c1e0: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
c1f0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
c200: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
c210: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c220: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
c230: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
c240: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c250: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
c260: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
c270: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
c280: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
c290: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
c2a0: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
c2b0: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
c2c0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
c2d0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
c2e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c2f0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
c310: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
c320: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
c330: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
c340: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
c350: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
c360: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
c370: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c380: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c390: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c3a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c3b0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
c3c0: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
c3d0: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23  ast++;.    }  .#
c3e0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
c3f0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c400: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c410: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
c420: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c430: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
c440: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
c450: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
c460: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
c470: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
c480: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
c490: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c4a0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c4b0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
c4c0: 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  f free block is 
c4d0: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
c4e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c4f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c500: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c510: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
c520: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
c530: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
c540: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
c550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
c560: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
c570: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
c580: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c590: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
c5a0: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c5b0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c5c0: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
c5d0: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
c5e0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
c5f0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
c600: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
c610: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
c620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c630: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c640: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
c650: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
c660: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
c670: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c680: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
c690: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
c6a0: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
c6b0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
c6c0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
c6d0: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
c6e0: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
c6f0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
c700: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
c710: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c720: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
c730: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
c740: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
c750: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
c760: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
c770: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
c780: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
c790: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
c7a0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
c7b0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c7c0: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
c7d0: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
c7e0: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
c7f0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
c800: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
c810: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
c820: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
c830: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c840: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c850: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c860: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
c870: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
c880: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
c890: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
c8a0: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
c8b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c8c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
c8d0: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
c8e0: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
c8f0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
c900: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
c910: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
c920: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
c930: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c940: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
c950: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c960: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c970: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
c980: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
c990: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
c9a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
c9b0: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
c9c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c9d0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
c9e0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c9f0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
ca00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ca10: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
ca20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
ca30: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
ca40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ca50: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ca60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
ca70: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
ca80: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
ca90: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
caa0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
cab0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cac0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
cad0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
cae0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
caf0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
cb00: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
cb10: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
cb20: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
cb30: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
cb40: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
cb50: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
cb60: 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
cb70: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
cb80: 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
cb90: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
cba0: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
cbb0: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
cbc0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
cbd0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
cbe0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
cbf0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
cc00: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
cc10: 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
cc20: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
cc30: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
cc40: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
cc50: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
cc60: 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
cc70: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
cc80: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
cc90: 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
cca0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
ccb0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
ccc0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
ccd0: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
cce0: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
ccf0: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
cd00: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
cd10: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
cd20: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
cd30: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
cd40: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
cd50: 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
cd60: 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
cd70: 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
cd80: 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
cd90: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
cda0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
cdb0: 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
cdc0: 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
cdd0: 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
cde0: 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
cdf0: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
ce00: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
ce10: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
ce20: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
ce30: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
ce40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
ce50: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
ce60: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
ce70: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
ce80: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
ce90: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
cea0: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
ceb0: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
cec0: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
ced0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   0;.  return pPa
cee0: 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
cef0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
cf00: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
cf10: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
cf20: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
cf30: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
cf40: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
cf50: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
cf60: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
cf70: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
cf80: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
cf90: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
cfa0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
cfb0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
cfc0: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
cfd0: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
cfe0: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
cff0: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
d000: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
d010: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
d020: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
d030: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
d040: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
d050: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
d060: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
d070: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
d080: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
d090: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
d0a0: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
d0b0: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
d0c0: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
d0d0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
d0e0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
d0f0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
d100: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
d110: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
d120: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d130: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
d140: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
d150: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
d160: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
d170: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
d180: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
d190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d1a0: 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
d1b0: 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
d1c0: 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
d1d0: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
d1e0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
d1f0: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
d200: 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
d210: 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
d220: 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
d230: 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
d240: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d250: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d260: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
d270: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
d280: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
d290: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
d2a0: 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
d2b0: 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
d2c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
d2d0: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
d2e0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
d2f0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
d300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d310: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
d320: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
d330: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d340: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
d350: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
d360: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
d370: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
d380: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
d390: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
d3a0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
d3b0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
d3c0: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
d3d0: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
d3e0: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
d3f0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
d400: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
d410: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
d420: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d430: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d440: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
d450: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
d460: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
d470: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
d480: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
d490: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
d4a0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
d4b0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
d4c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d4d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
d4e0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
d4f0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d500: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
d510: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
d520: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
d530: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
d540: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
d550: 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
d560: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
d570: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
d580: 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
d590: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
d5a0: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
d5b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d5c0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
d5d0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
d5e0: 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
d5f0: 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
d600: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   );.  return (in
d610: 74 29 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  t)btreePagecount
d620: 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
d630: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
d640: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
d650: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
d660: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d670: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
d680: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
d690: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
d6a0: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
d6b0: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
d6c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
d6d0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d6e0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
d6f0: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
d700: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
d710: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
d720: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
d730: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
d740: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
d750: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
d760: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
d770: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
d780: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d7a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d7b0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d7e0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
d7f0: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
d800: 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
d810: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d820: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d830: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62   here */.  int b
d840: 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20  Readonly        
d850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
d860: 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
d870: 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e   or 0 */.){.  in
d880: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
d890: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d8a0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d8b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 62 52 65 61  ;.  assert( bRea
d8c0: 64 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54  donly==PAGER_GET
d8d0: 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65  _READONLY || bRe
d8e0: 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20  adonly==0 );..  
d8f0: 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
d900: 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
d910: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d920: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d930: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
d940: 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
d950: 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
d960: 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20  bReadonly);.    
d970: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d980: 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e  K && (*ppPage)->
d990: 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
d9a0: 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
d9b0: 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
d9c0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d9d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d9e0: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
d9f0: 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  ppPage);.      }
da00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65  .    }.  }..  te
da10: 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20  stcase( pgno==0 
da20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
da30: 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  o!=0 || rc==SQLI
da40: 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20  TE_CORRUPT );.  
da50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
da60: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
da70: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
da80: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
da90: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
daa0: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
dab0: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
dac0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
dad0: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
dae0: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
daf0: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
db00: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
db10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
db20: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
db30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
db40: 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20  DbPage!=0 );.   
db50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
db60: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
db70: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
db80: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
db90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
dba0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
dbb0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
dbc0: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
dbd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
dbe0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
dbf0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
dc00: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
dc10: 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
dc20: 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ull(pPage->pDbPa
dc30: 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
dc40: 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
dc50: 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
dc60: 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
dc70: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
dc80: 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
dc90: 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
dca0: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
dcb0: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
dcc0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
dcd0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
dce0: 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
dcf0: 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
dd00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
dd10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
dd20: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
dd30: 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
dd40: 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
dd50: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
dd60: 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
dd70: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
dd80: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
dd90: 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
dda0: 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
ddb0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
ddc0: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
ddd0: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
dde0: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
ddf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
de00: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
de10: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
de20: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
de30: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
de40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
de50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
de60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
de70: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
de80: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
de90: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
dea0: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
deb0: 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
dec0: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
ded0: 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
dee0: 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
def0: 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
df00: 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
df10: 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
df20: 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
df30: 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
df40: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
df50: 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  o btreeInitPage(
df60: 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
df70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
df80: 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
df90: 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
dfa0: 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
dfb0: 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
dfc0: 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
dfd0: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
dfe0: 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
dff0: 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
e000: 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
e010: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
e020: 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
e030: 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
e040: 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
e050: 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
e060: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
e070: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
e080: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e090: 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
e0a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e0b0: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
e0c0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
e0d0: 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
e0e0: 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
e0f0: 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
e100: 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
e110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e120: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
e130: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
e140: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
e150: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
e160: 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
e170: 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ler);.}../*.** O
e180: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
e190: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
e1a0: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
e1b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
e1c0: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
e1d0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
e1e0: 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   then an ephemer
e1f0: 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63  al database is c
e200: 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68  reated.  The eph
e210: 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
e220: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c  might.** be excl
e230: 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72  usively in memor
e240: 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75  y, or it might u
e250: 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20  se a disk-based 
e260: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a  memory cache..**
e270: 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
e280: 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
e290: 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f  ase will be auto
e2a0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
e2b0: 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74  d .** when sqlit
e2c0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
e2d0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
e2e0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e2f0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
e300: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e310: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
e320: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
e330: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
e340: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
e350: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
e360: 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74   "flags" paramet
e370: 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
e380: 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61  that might conta
e390: 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20  in bits like.** 
e3a0: 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
e3b0: 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f  AL and/or BTREE_
e3c0: 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  MEMORY..**.** If
e3d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e3e0: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
e3f0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
e400: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
e410: 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e  ** and we are in
e420: 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f   shared cache mo
e430: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65  de, then the ope
e440: 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  n will fail with
e450: 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   an.** SQLITE_CO
e460: 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20  NSTRAINT error. 
e470: 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   We cannot allow
e480: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53   two or more BtS
e490: 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73  hared.** objects
e4a0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
e4b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e4c0: 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
e4d0: 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20  will lead.** to 
e4e0: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f  problems with lo
e4f0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
e500: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
e510: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
e520: 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53  Vfs,      /* VFS
e530: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
e540: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e   b-tree */.  con
e550: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e560: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
e570: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
e580: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
e590: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
e5a0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
e5b0: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
e5c0: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
e5d0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
e5e0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
e5f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
e600: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
e610: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
e620: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
e630: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
e640: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
e650: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
e660: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
e670: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
e680: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
e690: 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
e6a0: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20  *pBt = 0;       
e6b0: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
e6c0: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
e6d0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
e6e0: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
e700: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
e710: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
e720: 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20  ex *mutexOpen = 
e730: 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20  0;  /* Prevents 
e740: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
e750: 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a  . Ticket #3537 *
e760: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e770: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e780: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
e790: 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  e from this func
e7a0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65  tion */.  u8 nRe
e7b0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
e7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e7d0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e7e0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
e7f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
e800: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
e810: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
e820: 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ader content */.
e830: 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70  .  /* True if op
e840: 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ening an ephemer
e850: 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61  al, temporary da
e860: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
e870: 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d  t int isTempDb =
e880: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
e890: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30   zFilename[0]==0
e8a0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
e8b0: 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
e8c0: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
e8d0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e8e0: 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
e8f0: 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
e900: 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  sed database..  
e910: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
e920: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
e930: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
e940: 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  db = 0;.#else.  
e950: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
e960: 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26  b = (zFilename &
e970: 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  & strcmp(zFilena
e980: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  me, ":memory:")=
e990: 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
e9a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69             || (i
e9b0: 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74  sTempDb && sqlit
e9c0: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
e9d0: 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  b)).            
e9e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76             || (v
e9f0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ea00: 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30  _OPEN_MEMORY)!=0
ea10: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
ea20: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
ea30: 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29  ssert( pVfs!=0 )
ea40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ea50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
ea60: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
ea70: 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78  ssert( (flags&0x
ea80: 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20  ff)==flags );   
ea90: 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20  /* flags fit in 
eaa0: 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  8 bits */..  /* 
eab0: 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e  Only a BTREE_SIN
eac0: 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e  GLE database can
ead0: 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45   be BTREE_UNORDE
eae0: 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  RED */.  assert(
eaf0: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
eb00: 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c  UNORDERED)==0 ||
eb10: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
eb20: 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20  SINGLE)!=0 );.. 
eb30: 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47   /* A BTREE_SING
eb40: 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61  LE database is a
eb50: 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72  lways a temporar
eb60: 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72  y and/or ephemer
eb70: 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
eb80: 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
eb90: 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54  INGLE)==0 || isT
eba0: 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  empDb );..  if( 
ebb0: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66  isMemdb ){.    f
ebc0: 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45  lags |= BTREE_ME
ebd0: 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MORY;.  }.  if( 
ebe0: 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
ebf0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
ec00: 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20  !=0 && (isMemdb 
ec10: 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a  || isTempDb) ){.
ec20: 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28      vfsFlags = (
ec30: 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49  vfsFlags & ~SQLI
ec40: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
ec50: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54   | SQLITE_OPEN_T
ec60: 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20  EMP_DB;.  }.  p 
ec70: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
ec80: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65  ero(sizeof(Btree
ec90: 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ));.  if( !p ){.
eca0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ecb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
ecc0: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
ecd0: 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20  S_NONE;.  p->db 
ece0: 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  = db;.#ifndef SQ
ecf0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ed00: 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b  _CACHE.  p->lock
ed10: 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  .pBtree = p;.  p
ed20: 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20  ->lock.iTable = 
ed30: 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  1;.#endif..#if !
ed40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ed50: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ed60: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
ed70: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
ed80: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
ed90: 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
eda0: 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
edb0: 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
edc0: 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
edd0: 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
ede0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
edf0: 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
ee00: 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70   */.  if( isTemp
ee10: 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  Db==0 && (isMemd
ee20: 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67  b==0 || (vfsFlag
ee30: 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  s&SQLITE_OPEN_UR
ee40: 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  I)!=0) ){.    if
ee50: 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c  ( vfsFlags & SQL
ee60: 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
ee70: 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  ACHE ){.      in
ee80: 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
ee90: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
eea0: 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
eeb0: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
eec0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
eed0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
eee0: 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
eef0: 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
ef00: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
ef10: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
ef20: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  le = 1;.      if
ef30: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
ef40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ef50: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ef60: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ef70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ef80: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
ef90: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
efa0: 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
efb0: 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
efc0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
efd0: 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20  zFilename)+1);. 
efe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eff0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f000: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
f010: 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
f050: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
f060: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f080: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
f090: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
f0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f0b0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
f0c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
f0d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
f0e0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
f0f0: 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
f100: 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
f110: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
f120: 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
f130: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f140: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
f150: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
f160: 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
f170: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
f180: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
f190: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
f1a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f1b0: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
f1c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
f1d0: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
f1e0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
f1f0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
f200: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
f210: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
f220: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
f230: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
f240: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
f250: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
f260: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
f270: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
f280: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
f290: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
f2a0: 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
f2b0: 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
f2c0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
f2d0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
f2e0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
f2f0: 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
f300: 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
f310: 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
f320: 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
f330: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
f340: 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
f350: 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
f360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f370: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f380: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
f390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f3a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f3b0: 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f3d0: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
f3e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
f3f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f400: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
f410: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f420: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
f430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
f440: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f450: 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
f460: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
f470: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
f480: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f490: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f4a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f4b0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
f4c0: 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
f4d0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
f4e0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
f4f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
f500: 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
f510: 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
f520: 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
f530: 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
f540: 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
f550: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
f560: 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
f570: 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
f580: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
f590: 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
f5a0: 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
f5b0: 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
f5c0: 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
f5d0: 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
f5e0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
f5f0: 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
f600: 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
f610: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
f620: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
f630: 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
f640: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
f650: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
f660: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
f670: 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
f680: 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
f690: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
f6a0: 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
f6b0: 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
f6c0: 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
f6d0: 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
f6e0: 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
f6f0: 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
f700: 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
f710: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
f720: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
f730: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
f740: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
f750: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
f760: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
f770: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
f780: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
f790: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
f7a0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
f7b0: 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
f7c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f7d0: 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
f7e0: 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
f7f0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
f800: 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
f810: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
f820: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
f830: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
f840: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
f850: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
f860: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f870: 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
f880: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
f890: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
f8c0: 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
f8d0: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
f8e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f8f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f900: 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
f910: 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
f920: 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
f930: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f940: 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
f950: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
f960: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
f970: 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
f980: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
f990: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f9a0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
f9b0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
f9c0: 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
f9d0: 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
f9e0: 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
f9f0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
fa00: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
fa10: 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
fa20: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
fa30: 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
fa40: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
fa50: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
fa60: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
fa70: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
fa80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
fa90: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
faa0: 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
fab0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
fac0: 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  _ONLY;.#ifdef SQ
fad0: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
fae0: 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  TE.    pBt->btsF
faf0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
fb00: 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  RE_DELETE;.#endi
fb10: 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  f.    pBt->pageS
fb20: 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
fb30: 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
fb40: 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
fb50: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
fb60: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
fb70: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
fb80: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
fb90: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
fba0: 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
fbb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
fbc0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
fbd0: 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
fbe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fbf0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
fc00: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
fc10: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
fc20: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
fc30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
fc40: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
fc50: 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
fc60: 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
fc70: 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
fc80: 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
fc90: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
fca0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
fcb0: 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
fcc0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
fcd0: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
fce0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
fcf0: 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
fd00: 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
fd10: 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
fd20: 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
fd30: 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
fd40: 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
fd50: 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
fd60: 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
fd70: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
fd80: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
fd90: 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
fda0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
fdb0: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
fdc0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
fdd0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
fde0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
fdf0: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
fe00: 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
fe10: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
fe20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
fe30: 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
fe40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65  }else{.      nRe
fe50: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
fe60: 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
fe70: 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
fe80: 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
fe90: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
fea0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
feb0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
fec0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
fed0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
fee0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
fef0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
ff00: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ff10: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
ff20: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
ff30: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
ff40: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
ff50: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
ff60: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
ff70: 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
ff80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
ff90: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
ffa0: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
ffb0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
ffc0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
ffd0: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
ffe0: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
fff0: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
10000 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
10010 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
10020 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
10030 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10040 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
10050 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10060 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
10070 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
10080 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
10090 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
100a0 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
100b0 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
100c0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
100d0 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  {.      MUTEX_LO
100e0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
100f0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
10100 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52   ).      pBt->nR
10110 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55  ef = 1;.      MU
10120 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78  TEX_LOGIC( mutex
10130 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
10140 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10150 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
10160 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69  ASTER);).      i
10170 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
10180 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
10190 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
101a0 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
101b0 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
101c0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
101d0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
101e0 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
101f0 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
10200 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
10210 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10220 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
10230 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
10240 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
10250 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
10260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10270 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10280 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
10290 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
102a0 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
102b0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
102c0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
102d0 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
102e0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
102f0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
10300 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
10310 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10320 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
10330 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
10340 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
10350 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
10360 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
10370 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10380 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
10390 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
103a0 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
103b0 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
103c0 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
103d0 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
103e0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
103f0 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
10400 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
10410 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
10420 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
10430 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
10440 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
10450 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
10460 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
10470 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
10480 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
10490 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
104a0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
104b0 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
104c0 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
104d0 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
104e0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
104f0 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
10500 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
10510 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
10520 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
10530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
10540 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
10550 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
10560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10570 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
10580 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10590 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
105a0 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
105b0 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
105c0 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
105d0 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
105e0 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
105f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10600 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
10610 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
10620 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
10630 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
10640 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
10650 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
10660 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
10670 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10680 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
10690 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
106a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
106b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
106c0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
106d0 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
106e0 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
106f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10700 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
10710 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
10720 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
10730 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
10740 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
10750 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
10760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10770 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
10780 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
10790 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
107a0 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73  -Tree was succes
107b0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73  sfully opened, s
107c0 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  et the pager-cac
107d0 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20  he size to the. 
107e0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61     ** default va
107f0 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65  lue. Except, whe
10800 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20  n opening on an 
10810 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20  existing shared 
10820 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20  pager-cache,.   
10830 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67   ** do not chang
10840 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  e the pager-cach
10850 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
10860 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
10870 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20  reeSchema(p, 0, 
10880 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)==0 ){.      s
10890 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
108a0 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e  chesize(p->pBt->
108b0 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
108c0 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
108d0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  E);.    }.  }.  
108e0 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
108f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
10900 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10910 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
10920 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10930 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
10940 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10950 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
10960 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
10970 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
10980 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
10990 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
109a0 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
109b0 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
109c0 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
109d0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
109e0 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
109f0 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
10a00 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
10a10 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
10a20 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
10a30 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
10a40 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
10a50 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
10a60 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
10a70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10a80 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55  HARED_CACHE.  MU
10a90 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
10aa0 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
10ab0 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20  r; ).  BtShared 
10ac0 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
10ad0 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
10ae0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10af0 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
10b00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54  >mutex) );.  MUT
10b10 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
10b20 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
10b30 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10b40 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
10b50 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
10b60 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
10b70 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
10b80 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
10b90 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
10ba0 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
10bb0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10bc0 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
10bd0 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
10be0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
10bf0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
10c00 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
10c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
10c30 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
10c40 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
10c50 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
10c60 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
10c70 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
10c80 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
10c90 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
10ca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10cb0 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
10cc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
10cd0 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
10ce0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
10cf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
10d00 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
10d10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10d20 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
10d30 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
10d40 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
10d50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
10d60 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
10d70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
10d80 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
10d90 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
10da0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
10db0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
10dc0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
10dd0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
10de0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
10df0 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
10e00 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
10e10 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
10e20 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
10e30 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
10e40 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
10e50 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
10e60 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
10e70 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  pageSize );..   
10e80 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75   /* One of the u
10e90 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70  ses of pBt->pTmp
10ea0 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d  Space is to form
10eb0 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a  at cells before.
10ec0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67      ** inserting
10ed0 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61   them into a lea
10ee0 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e  f page (function
10ef0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20   fillInCell()). 
10f00 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c  If.    ** a cell
10f10 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20   is less than 4 
10f20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
10f30 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20  t is rounded up 
10f40 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a  to 4 bytes.    *
10f50 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  * by the various
10f60 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
10f70 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79  anipulate binary
10f80 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20   cells. Which.  
10f90 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68    ** can mean th
10fa0 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  at fillInCell() 
10fb0 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73  only initializes
10fc0 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20   the first 2 or 
10fd0 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  3.    ** bytes o
10fe0 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74  f pTmpSpace, but
10ff0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
11000 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69  4 bytes are copi
11010 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69  ed from.    ** i
11020 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73  t into a databas
11030 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20  e page. This is 
11040 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70  not actually a p
11050 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20  roblem, but it. 
11060 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65     ** does cause
11070 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f   a valgrind erro
11080 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20  r when the 1 or 
11090 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69  2 bytes of uniti
110a0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64  alized .    ** d
110b0 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
110c0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69   system call wri
110d0 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69  te(). So to avoi
110e0 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20  d this error,.  
110f0 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69    ** zero the fi
11100 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
11110 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 20  emp space here. 
11120 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
11130 3e 70 54 6d 70 53 70 61 63 65 20 29 20 6d 65 6d  >pTmpSpace ) mem
11140 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
11150 63 65 2c 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d  ce, 0, 4);.  }.}
11160 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
11170 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
11180 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
11190 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
111a0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
111b0 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
111c0 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e  3PageFree( pBt->
111d0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42  pTmpSpace);.  pB
111e0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
111f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
11200 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
11210 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
11220 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
11230 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11240 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
11250 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11260 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
11270 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
11280 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
11290 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
112a0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
112b0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
112c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
112d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
112e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
112f0 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
11300 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
11310 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
11320 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
11330 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
11340 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
11350 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
11360 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
11370 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11380 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
11390 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
113a0 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
113b0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
113c0 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
113d0 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
113e0 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
113f0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
11400 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
11410 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
11420 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
11430 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
11440 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
11450 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f  lback(p, SQLITE_
11460 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  OK);.  sqlite3Bt
11470 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
11480 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
11490 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
114a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
114b0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
114c0 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
114d0 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
114e0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
114f0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
11500 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
11510 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
11520 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
11530 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
11540 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
11550 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
11560 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
11570 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
11580 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
11590 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
115a0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
115b0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
115c0 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
115d0 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
115e0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
115f0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
11600 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
11610 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
11620 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
11630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11640 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
11650 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
11660 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
11670 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
11680 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
11690 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
116a0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
116b0 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
116c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
116d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
116e0 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
116f0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
11700 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11710 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11720 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
11730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
11740 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
11750 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
11760 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
11770 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
11780 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
11790 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
117a0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
117b0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
117c0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
117d0 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
117e0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
117f0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
11800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11810 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
11820 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
11830 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
11840 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
11850 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
11860 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
11870 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
11880 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
11890 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
118a0 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
118b0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
118c0 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
118d0 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
118e0 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
118f0 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
11900 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
11910 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
11920 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
11930 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
11940 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
11950 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
11960 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
11970 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
11980 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
11990 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
119a0 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
119b0 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
119c0 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
119d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
119e0 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
119f0 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
11a00 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
11a10 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
11a20 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
11a30 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
11a40 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
11a50 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
11a60 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
11a70 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
11a80 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
11a90 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
11aa0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
11ab0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
11ac0 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
11ad0 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
11ae0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
11af0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
11b00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11b10 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
11b20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11b30 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11b40 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11b50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11b60 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
11b70 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
11b80 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
11b90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11ba0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
11bc0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
11bd0 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
11be0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
11bf0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
11c00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11c10 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
11c20 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
11c30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11c40 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
11c50 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
11c60 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
11c70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11c80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11c90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11ca0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
11cb0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
11cc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11cd0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
11ce0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
11cf0 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
11d00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11d10 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11d20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11d30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11d40 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
11d50 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
11d60 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
11d70 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
11d80 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
11d90 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
11da0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
11db0 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
11dc0 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
11dd0 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
11de0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
11df0 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
11e00 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
11e10 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
11e20 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
11e30 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
11e40 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
11e50 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
11e60 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
11e70 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
11e80 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
11e90 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
11ea0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
11eb0 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
11ec0 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
11ed0 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
11ee0 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
11ef0 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
11f00 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
11f10 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11f20 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
11f30 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
11f40 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
11f50 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f70 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11f80 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11f90 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
11fa0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
11fb0 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
11fc0 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
11fd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11fe0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11ff0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12000 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
12010 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
12020 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12030 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
12040 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
12050 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
12060 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12070 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
12080 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
12090 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
120a0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
120b0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
120c0 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
120d0 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
120e0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
120f0 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
12100 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
12110 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
12120 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
12130 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
12140 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
12150 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12160 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
12170 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12180 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
12190 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
121a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
121b0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
121c0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
121d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
121e0 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
121f0 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
12200 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12210 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12220 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
12230 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
12240 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
12250 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
12260 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
12270 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
12280 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
12290 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
122a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
122b0 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
122c0 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
122d0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
122e0 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
122f0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
12300 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
12310 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
12320 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
12330 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
12340 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
12350 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
12360 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
12370 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
12380 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
12390 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
123a0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
123b0 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
123c0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
123d0 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
123e0 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
123f0 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
12400 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
12410 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
12420 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
12430 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
12440 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
12450 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
12460 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
12470 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
12480 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
12490 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
124a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
124b0 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
124c0 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
124d0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
124e0 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
124f0 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
12500 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
12510 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
12520 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
12530 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
12540 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
12550 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
12560 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12570 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
12580 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
12590 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
125a0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
125b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
125c0 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
125d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
125e0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
125f0 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
12600 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
12610 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12620 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
12630 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
12640 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
12650 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12660 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
12670 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
12690 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
126a0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
126b0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
126c0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
126d0 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
126e0 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
126f0 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
12700 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
12710 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
12720 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
12730 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
12740 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
12750 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
12760 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
12770 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
12780 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
12790 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
127a0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
127b0 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
127c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
127d0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
127e0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
127f0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
12800 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
12810 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
12820 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
12830 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
12840 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
12850 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
12860 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
12870 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
12880 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
12890 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
128a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
128b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
128c0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
128d0 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
128e0 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
128f0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
12900 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
12910 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
12920 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  pageSize;.}..#if
12930 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12940 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65  HAS_CODEC) || de
12950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
12960 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  UG)./*.** This f
12970 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
12980 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
12990 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
129a0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
129b0 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
129c0 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
129d0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
129e0 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
129f0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
12a00 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
12a10 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
12a20 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
12a30 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
12a40 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
12a50 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
12a60 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
12a70 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
12a80 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
12a90 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
12aa0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
12ab0 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
12ac0 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
12ad0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
12ae0 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
12af0 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
12b00 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
12b10 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
12b20 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
12b30 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
12b40 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
12b50 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
12b60 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
12b70 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
12b80 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
12b90 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
12ba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12bb0 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
12bc0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
12bd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
12be0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
12bf0 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
12c00 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
12c10 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47   || SQLITE_DEBUG
12c20 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
12c30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
12c40 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
12c50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12c60 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
12c70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
12c80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
12c90 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
12ca0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
12cb0 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
12cc0 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
12cd0 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
12ce0 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
12cf0 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
12d00 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
12d10 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
12d20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12d30 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
12d40 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
12d50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12d60 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
12d70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
12d80 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
12d90 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
12da0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12db0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
12dc0 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
12dd0 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
12de0 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
12df0 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
12e00 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
12e10 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
12e20 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
12e30 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
12e40 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
12e50 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
12e60 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
12e70 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
12e80 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
12e90 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
12ea0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
12eb0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
12ec0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12ed0 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
12ee0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
12ef0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
12f00 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
12f10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12f20 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
12f30 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
12f40 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
12f50 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
12f60 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
12f70 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
12f80 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
12f90 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
12fa0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
12fb0 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
12fc0 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
12fd0 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
12fe0 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
12ff0 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
13000 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
13010 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
13020 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
13030 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13040 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13050 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
13060 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
13070 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
13080 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
13090 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
130a0 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
130b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
130c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
130d0 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
130e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
130f0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
13100 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
13110 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13120 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69  eturn b;.}.#endi
13130 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
13140 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
13150 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
13160 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13170 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
13180 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
13190 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
131a0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
131b0 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
131c0 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
131d0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
131e0 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
131f0 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
13200 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
13210 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
13220 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
13230 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
13240 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
13250 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
13260 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
13270 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
13280 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
13290 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
132a0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
132b0 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
132c0 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
132d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
132e0 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
132f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
13300 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
13310 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13320 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13330 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
13340 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
13350 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13360 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
13370 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
13380 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
13390 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
133a0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
133b0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
133c0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
133d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
133e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
133f0 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
13400 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
13410 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
13420 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13430 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13440 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
13450 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
13460 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
13470 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
13480 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
13490 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
134a0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
134b0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
134c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
134d0 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
134e0 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
134f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13500 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
13510 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
13520 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
13530 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
13540 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13550 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
13560 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
13570 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
13580 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
13590 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
135a0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
135b0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
135c0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
135d0 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
135e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
135f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
13600 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
13610 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
13620 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
13630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13640 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
13650 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
13660 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
13670 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
13680 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
13690 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
136a0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
136b0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
136c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
136d0 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
136e0 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
136f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
13700 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
13710 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
13720 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
13730 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
13740 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
13750 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
13760 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
13770 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
13780 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
137a0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
137b0 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
137c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
137d0 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
137e0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
137f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
13800 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
13810 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
13820 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
13830 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
13840 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
13850 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13860 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13870 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
13880 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
13890 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
138a0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
138b0 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
138c0 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
138d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
138e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
138f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
13900 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
13910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13920 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
13930 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
13940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13950 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
13960 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
13970 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
13980 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
13990 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
139a0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
139b0 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
139c0 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
139d0 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
139e0 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
139f0 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
13a00 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
13a10 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
13a20 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
13a30 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
13a40 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
13a50 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
13a60 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
13a70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
13a80 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
13a90 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
13aa0 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
13ab0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
13ac0 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
13ad0 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
13ae0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
13af0 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
13b00 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
13b10 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
13b20 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
13b30 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
13b40 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
13b50 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
13b60 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
13b70 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
13b80 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13b90 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13ba0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13bb0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
13bc0 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
13bd0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13be0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
13bf0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
13c00 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
13c10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13c20 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13c30 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
13c40 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
13c50 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
13c60 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
13c70 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
13c80 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13c90 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
13ca0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13cb0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
13cc0 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
13cd0 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
13ce0 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
13cf0 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
13d00 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
13d10 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
13d20 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
13d30 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
13d40 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
13d50 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
13d60 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
13d70 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
13d80 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
13d90 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
13da0 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
13db0 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
13dc0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
13dd0 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
13de0 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
13df0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
13e00 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
13e10 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
13e20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
13e30 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
13e40 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
13e50 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
13e60 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
13e70 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
13e80 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13e90 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
13ea0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
13eb0 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
13ec0 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
13ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13ee0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
13ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
13f00 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
13f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13f20 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
13f30 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13f40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13f50 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ( isOpen==0 ){. 
13f60 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
13f70 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13f80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13f90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
13fa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13fb0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
13fc0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
13fd0 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
13fe0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13ff0 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
14000 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
14010 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
14020 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
14030 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
14040 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
14050 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
14060 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
14070 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
14080 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
14090 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
140a0 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
140b0 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
140c0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
140d0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
140e0 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
140f0 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
14100 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
14110 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
14120 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
14130 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
14140 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
14150 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
14160 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
14170 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
14180 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
14190 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
141a0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
141b0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
141c0 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
141d0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
141e0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
141f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
14200 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
14210 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
14220 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
14230 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
14240 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
14250 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
14260 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
14270 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
14280 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
14290 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
142a0 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
142b0 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
142c0 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
142d0 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
142e0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
142f0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
14300 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
14310 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
14320 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
14330 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
14340 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
14350 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
14360 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
14370 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
14380 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
14390 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
143a0 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
143b0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
143c0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
143d0 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
143e0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
143f0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
14400 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
14410 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
14420 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
14430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14440 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
14450 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
14460 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
144a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
144b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
144c0 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
144d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
144e0 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
144f0 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
14500 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
14510 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14520 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
14530 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
14540 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
14550 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
14560 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
14570 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14580 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
14590 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
145a0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
145b0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
145c0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
145d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
145e0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
145f0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
14600 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
14610 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
14620 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
14630 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
14640 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
14650 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
14660 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
14670 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
14680 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
14690 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
146a0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
146b0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
146c0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
146d0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
146e0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
146f0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
14700 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
14710 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
14720 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
14730 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
14740 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
14750 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
14760 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
14770 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
14780 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
14790 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
147a0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
147b0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
147c0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
147d0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
147e0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
147f0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
14800 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
14810 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
14820 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
14830 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
14840 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
14850 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
14860 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
14870 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
14880 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
14890 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
148a0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
148b0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
148c0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
148d0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
148e0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
148f0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
14900 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
14910 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
14920 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
14930 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
14940 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
14950 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
14960 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
14970 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
14980 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
14990 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
149a0 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
149b0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
149c0 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
149d0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
149e0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
149f0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
14a00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
14a10 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
14a20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
14a30 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
14a40 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
14a50 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
14a60 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
14a70 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
14a80 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
14a90 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
14aa0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
14ab0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
14ac0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
14ad0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
14ae0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14af0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
14b00 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
14b10 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
14b20 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
14b30 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
14b40 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
14b50 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
14b60 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
14b70 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
14b80 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
14b90 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
14ba0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
14bb0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
14bc0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
14bd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
14be0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
14bf0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
14c00 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
14c10 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
14c20 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
14c30 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
14c40 68 65 20 64 61 74 61 62 73 65 2e 20 20 43 75 72  he databse.  Cur
14c50 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
14c60 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
14c70 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
14c80 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
14c90 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
14ca0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
14cb0 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
14cc0 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
14cd0 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
14ce0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
14cf0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
14d00 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
14d10 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
14d20 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
14d30 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
14d40 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
14d50 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
14d60 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
14d70 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
14d80 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
14d90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
14da0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
14db0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
14dc0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
14dd0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
14de0 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
14df0 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
14e00 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
14e10 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
14e20 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
14e30 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
14e40 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
14e50 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
14e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
14e70 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
14e80 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
14e90 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
14ea0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
14eb0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
14ec0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
14ed0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14ee0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
14ef0 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
14f00 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
14f10 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
14f20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14f30 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
14f40 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14f50 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
14f60 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
14f70 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
14f80 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
14f90 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
14fa0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14fb0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
14fc0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
14fd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
14fe0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
14ff0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15000 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
15010 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
15020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15030 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
15040 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
15050 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
15060 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
15070 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
15080 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
15090 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
150a0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
150b0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
150c0 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
150d0 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
150e0 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
150f0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
15100 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
15110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
15120 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
15130 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
15140 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
15150 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
15160 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15170 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15180 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
15190 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
151a0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
151b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
151c0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
151d0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
151e0 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
151f0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
15200 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
15210 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15220 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
15230 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15240 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
15250 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
15260 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
15270 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
15280 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
15290 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
152a0 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
152b0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
152c0 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
152d0 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
152e0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
152f0 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
15300 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
15310 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
15320 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
15330 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
15340 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
15350 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
15360 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
15370 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
15380 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
15390 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
153a0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
153b0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
153c0 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
153d0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
153e0 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
153f0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
15400 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
15410 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
15420 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
15430 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
15440 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
15450 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15460 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
15470 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
15480 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
15490 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
154a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
154b0 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
154c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
154d0 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
154e0 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
154f0 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
15500 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
15510 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
15520 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
15530 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
15540 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
15550 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
15560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15570 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
15580 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
15590 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
155a0 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
155b0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
155c0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
155d0 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
155e0 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
155f0 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
15600 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
15610 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
15620 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
15630 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
15640 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
15650 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
15660 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
15670 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15680 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
15690 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
156a0 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
156b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
156c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
156d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
156e0 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
156f0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
15700 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
15710 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
15720 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
15730 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
15740 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
15750 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
15760 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
15770 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15780 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
15790 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
157a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
157b0 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
157c0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
157d0 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
157e0 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
157f0 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
15800 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
15810 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
15820 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
15830 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
15840 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
15850 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
15860 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
15870 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
15880 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
15890 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
158a0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
158b0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
158c0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
158d0 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
158e0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
158f0 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
15900 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
15910 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
15920 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
15930 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
15940 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
15950 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15960 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
15970 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15980 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
15990 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
159a0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
159b0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
159c0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
159d0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
159e0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
159f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15a00 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
15a10 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
15a20 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
15a30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
15a40 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
15a50 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
15a60 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
15a70 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
15a80 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
15a90 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
15aa0 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
15ab0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
15ac0 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
15ad0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
15ae0 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
15af0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
15b00 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
15b10 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
15b20 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
15b30 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
15b40 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
15b50 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
15b60 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
15b70 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
15b80 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
15b90 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
15ba0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
15bb0 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
15bc0 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
15bd0 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
15be0 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
15bf0 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
15c00 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
15c10 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
15c20 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
15c30 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
15c40 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
15c50 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
15c60 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
15c70 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
15c80 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
15c90 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
15ca0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
15cb0 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
15cc0 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
15cd0 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
15ce0 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
15cf0 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
15d00 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
15d10 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
15d20 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
15d30 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
15d40 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
15d50 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
15d60 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
15d70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15d80 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
15d90 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
15da0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
15db0 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
15dc0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15dd0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
15de0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
15df0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15e00 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
15e10 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
15e20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
15e30 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
15e40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
15e50 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
15e60 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
15e70 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
15e80 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
15e90 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
15ea0 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
15eb0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
15ec0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
15ed0 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
15ee0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
15ef0 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
15f00 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
15f10 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
15f20 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
15f30 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
15f40 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
15f50 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
15f60 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
15f70 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
15f80 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
15f90 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
15fa0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
15fb0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
15fc0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
15fd0 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
15fe0 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
15ff0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16000 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
16010 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
16020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16030 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
16040 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
16050 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
16060 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
16070 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
16080 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
16090 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
160a0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
160b0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
160c0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
160d0 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
160e0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
160f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
16100 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
16110 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
16120 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
16130 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16140 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
16150 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
16160 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
16170 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
16180 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
16190 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
161a0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
161b0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
161c0 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
161d0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
161e0 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
161f0 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
16200 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
16210 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
16220 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16230 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
16240 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
16250 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
16260 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
16270 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
16280 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
16290 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
162a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
162b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
162c0 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
162d0 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
162e0 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
162f0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
16300 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
16310 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
16320 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
16330 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
16340 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
16350 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
16360 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
16370 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
16380 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
16390 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
163a0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
163b0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
163c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
163d0 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
163e0 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
163f0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
16400 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
16410 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
16420 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
16430 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
16440 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
16450 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
16460 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
16470 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
16480 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
16490 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
164a0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
164b0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
164c0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
164d0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
164e0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
164f0 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
16500 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
16510 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
16520 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
16530 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
16540 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
16550 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
16560 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
16570 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
16580 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
16590 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
165a0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
165b0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
165c0 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
165d0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
165e0 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
165f0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
16600 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
16610 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
16620 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
16630 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16640 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
16650 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
16660 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
16670 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
16680 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16690 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
166a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
166b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
166c0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
166d0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
166e0 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
166f0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
16700 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16720 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
16730 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
16740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16750 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
16760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16770 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
16780 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
16790 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
167a0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
167b0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
167c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
167d0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
167e0 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
167f0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
16800 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
16810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16820 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
16830 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
16840 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
16850 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
16860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16870 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
16880 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
16890 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
168a0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
168b0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
168c0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
168d0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
168e0 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
168f0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
16900 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
16910 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
16920 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
16930 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
16940 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
16950 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
16960 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
16970 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
16980 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
16990 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
169a0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
169b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
169c0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
169d0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
169e0 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
169f0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
16a00 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
16a10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16a20 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
16a30 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
16a40 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
16a50 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
16a60 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
16a70 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
16a80 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
16a90 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
16aa0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16ab0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
16ac0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
16ad0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
16ae0 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
16af0 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
16b00 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
16b10 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
16b20 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
16b30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16b40 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
16b50 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
16b60 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
16b70 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
16b80 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
16b90 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
16ba0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
16bb0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
16bc0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
16bd0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
16be0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
16bf0 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
16c00 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
16c10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16c20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16c30 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
16c40 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
16c50 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
16c60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16c70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
16c80 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
16c90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16cb0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
16cc0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
16cd0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
16ce0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16d00 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
16d10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16d20 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
16d30 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
16d40 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
16d50 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
16d60 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
16d70 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
16d80 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
16d90 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
16da0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
16db0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
16dc0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16dd0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16de0 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
16df0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
16e00 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
16e10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
16e20 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
16e30 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
16e40 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
16e50 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
16e60 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
16e70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16ea0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
16eb0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
16ec0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
16ed0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
16ee0 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
16ef0 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
16f00 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
16f10 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
16f20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
16f30 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
16f40 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
16f50 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
16f60 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
16f70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
16f80 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
16f90 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
16fa0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
16fd0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
16fe0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
17010 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
17020 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
17050 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
17060 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
17070 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
17080 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
17090 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
170a0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
170b0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
170c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
170d0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
170e0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
170f0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
17100 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
17110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17120 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
17130 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
17140 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
17150 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
17160 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
17170 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
17180 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
17190 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
171a0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
171b0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
171c0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
171d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
171e0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
171f0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
17200 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
17210 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
17220 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
17230 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
17240 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
17250 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
17260 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
17270 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
17280 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
17290 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
172a0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
172b0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
172c0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
172d0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
172e0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
172f0 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
17300 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
17310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17320 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
17330 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
17340 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
17350 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
17360 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
17370 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
17380 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
17390 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
173a0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
173b0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
173c0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
173d0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
173e0 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
173f0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
17400 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
17410 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
17420 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
17430 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
17440 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
17450 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
17460 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
17470 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
17480 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
17490 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
174b0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
174c0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
174d0 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
174e0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
174f0 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
17500 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
17510 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
17520 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
17530 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17540 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
17550 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
17560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
17570 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
17580 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
17590 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
175a0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
175b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
175c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
175d0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
175e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
175f0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
17600 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
17610 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
17620 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17630 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
17640 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
17650 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
17660 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
17670 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
17680 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
17690 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
176a0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
176b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
176c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
176d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
176e0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
176f0 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
17700 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
17710 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
17720 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
17730 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
17740 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
17750 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
17760 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
17770 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
17780 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
17790 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
177a0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
177b0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
177c0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
177d0 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
177e0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
177f0 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
17800 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
17810 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
17820 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
17830 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
17840 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
17850 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
17860 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
17870 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
17880 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
17890 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
178a0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
178b0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
178c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
178d0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
178e0 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
178f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
17920 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
17930 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
17940 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
17950 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
17960 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17980 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
17990 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
179a0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
179b0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
179c0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
179d0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
179e0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
179f0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
17a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17a10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17a30 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
17a40 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
17a50 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
17a60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
17a70 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
17a80 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
17a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17aa0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
17ab0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
17ac0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
17ad0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
17ae0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
17af0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
17b00 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
17b10 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
17b20 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
17b30 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
17b40 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
17b50 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
17b60 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
17b70 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
17b80 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
17b90 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
17ba0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
17bb0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
17bc0 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
17bd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
17be0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
17bf0 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
17c00 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
17c10 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
17c20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
17c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
17c40 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
17c50 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
17c60 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
17c70 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
17c80 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
17c90 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
17ca0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
17cb0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
17cc0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
17cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
17ce0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
17cf0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
17d00 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
17d10 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
17d20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
17d30 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
17d40 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
17d50 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
17d60 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
17d70 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
17d80 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
17d90 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
17da0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
17db0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
17dc0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
17dd0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
17de0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
17df0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
17e00 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
17e10 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
17e20 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
17e30 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
17e40 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
17e50 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
17e60 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
17e70 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
17e80 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
17e90 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
17ea0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
17eb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17ec0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
17ee0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
17ef0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
17f00 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
17f10 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
17f20 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
17f30 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
17f40 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
17f50 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
17f60 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
17f70 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
17f80 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
17f90 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
17fa0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
17fb0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
17fc0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17fd0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
17fe0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
17ff0 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
18000 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
18020 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
18030 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
18040 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
18050 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
18060 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
18070 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
18080 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
18090 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
180a0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
180b0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
180c0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
180d0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
180e0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
180f0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
18100 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
18110 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
18120 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
18130 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
18140 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
18150 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
18160 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
18170 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
18180 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
18190 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
181a0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
181b0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
181c0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
181d0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
181e0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
181f0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
18200 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
18210 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
18220 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
18230 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
18240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18250 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
18260 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
18270 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
18280 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
18290 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
182a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
182b0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
182c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
182d0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
182e0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
182f0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
18300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18320 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18330 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
18340 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
18350 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
18360 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
18370 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
18380 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
18390 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
183a0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
183b0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
183c0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
183d0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
183e0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
183f0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
18400 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
18410 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
18420 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
18430 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
18440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18450 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18460 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
18470 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
18480 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
18490 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
184a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
184b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
184c0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
184d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
184e0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
184f0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
18500 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
18510 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
18520 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
18530 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
18540 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18550 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
18560 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
18570 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
18580 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
18590 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
185a0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
185b0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
185c0 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
185d0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
185e0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
185f0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
18600 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
18610 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
18620 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
18630 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
18640 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
18650 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
18660 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
18670 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
18680 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
18690 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
186a0 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
186b0 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
186c0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
186d0 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
186e0 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
186f0 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
18700 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
18710 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
18720 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
18730 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
18740 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
18750 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
18760 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
18770 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  so .** that the 
18780 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
18790 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
187a0 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e  in use is no lon
187b0 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
187c0 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e  * Parameter nFin
187d0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
187e0 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69  f pages that thi
187f0 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64  s database would
18800 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65   contain.** were
18810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
18820 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72  alled until it r
18830 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
18840 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  NE..**.** If the
18850 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74   bCommit paramet
18860 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
18870 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
18880 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a  sumes that the .
18890 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  ** caller will k
188a0 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
188b0 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
188c0 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
188d0 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72  LITE_DONE .** or
188e0 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d   an error. bComm
188f0 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75  it is passed tru
18900 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  e for an auto-va
18910 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74 20  cuum-on-commmit 
18920 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
18930 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
18940 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
18950 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
18960 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
18970 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
18980 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
18990 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
189a0 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
189b0 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
189c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
189d0 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
189e0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
189f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
18a00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18a10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
18a20 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
18a30 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
18a40 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
18a50 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
18a60 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
18a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
18a80 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
18a90 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
18aa0 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
18ab0 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
18ac0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18ad0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
18ae0 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
18af0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
18b00 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
18b10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
18b20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
18b30 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
18b40 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
18b50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18b60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
18b70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18b80 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
18b90 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
18ba0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18bb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18bc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
18bd0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
18be0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
18bf0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
18c00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
18c10 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
18c20 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
18c30 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
18c40 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
18c50 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
18c60 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
18c70 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
18c80 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
18c90 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
18ca0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
18cb0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
18cc0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
18cd0 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
18ce0 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
18cf0 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
18d00 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
18d10 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
18d20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
18d30 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
18d40 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
18d50 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
18d60 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
18d70 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
18d80 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
18d90 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
18da0 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
18db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
18dd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
18de0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18df0 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
18e00 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
18e10 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
18e20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18e30 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
18e40 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
18e50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18e60 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
18e70 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
18e80 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
18e90 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
18ea0 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
18eb0 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
18ec0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
18ed0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
18ee0 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
18ef0 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
18f00 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
18f10 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
18f20 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
18f30 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
18f40 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
18f50 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
18f60 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
18f70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18f90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18fa0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
18fb0 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
18fc0 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
18fd0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
18fe0 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
18ff0 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
19000 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
19010 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
19020 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
19030 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
19040 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
19050 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
19060 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
19070 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
19080 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
19090 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
190a0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
190b0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
190c0 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
190d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
190e0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
190f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
19100 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
19110 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
19120 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
19130 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
19140 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
19150 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
19160 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
19170 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
19180 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
19190 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
191a0 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
191b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
191c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
191d0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
191e0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
191f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
19200 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
19210 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19220 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
19230 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
19240 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
19250 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
19260 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
19270 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
19280 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
19290 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
192a0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
192b0 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
192c0 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
192d0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
192e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
192f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19300 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19320 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
19330 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
19340 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
19350 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
19360 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
19370 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
19380 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
19390 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
193a0 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
193b0 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
193c0 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
193d0 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
193e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
193f0 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
19400 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
19410 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
19420 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
19430 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
19440 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
19450 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
19460 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
19470 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
19480 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
19490 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
194a0 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
194b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
194c0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
194d0 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
194e0 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
194f0 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
19500 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
19510 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19530 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
19540 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
19550 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
19560 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
19570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19580 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
19590 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
195a0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
195d0 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
195e0 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
195f0 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
19600 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
19610 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
19620 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
19630 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
19640 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
19650 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
19660 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
19670 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
19680 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
19690 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
196a0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
196b0 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
196c0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
196d0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
196e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
196f0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
19700 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
19710 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
19720 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
19730 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
19740 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
19750 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
19760 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
19770 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
19780 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
19790 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
197a0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
197b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
197c0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
197d0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
197e0 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
197f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
19800 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
19810 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
19820 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
19830 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
19840 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
19850 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
19860 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
19870 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
19880 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
19890 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
198a0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
198b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
198c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
198d0 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
198e0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
198f0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
19900 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
19910 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
19920 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
19930 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
19940 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
19950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
19960 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
19970 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
19980 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
19990 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
199a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
199b0 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
199c0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
199d0 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
199e0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
199f0 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
19a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19a10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
19a20 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
19a30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
19a40 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
19a50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
19a60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19a70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
19a80 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
19a90 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
19aa0 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
19ab0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
19ac0 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
19ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19ae0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19af0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
19b00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
19b10 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
19b20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
19b30 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
19b40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
19b50 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
19b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
19b70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19b80 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
19b90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
19ba0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19bc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
19bd0 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
19be0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
19bf0 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
19c00 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
19c10 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
19c20 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
19c30 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
19c40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
19c50 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
19c60 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
19c70 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
19c80 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19c90 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
19ca0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
19cb0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
19cc0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
19cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
19ce0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
19cf0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
19d00 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
19d10 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
19d20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
19d30 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
19d40 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
19d50 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
19d60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
19d70 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19d80 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
19d90 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
19da0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
19db0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
19dc0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
19dd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19de0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19df0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
19e00 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
19e10 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
19e20 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
19e30 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
19e40 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
19e50 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
19e60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19e70 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
19e80 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
19e90 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
19ea0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
19eb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
19ec0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
19ed0 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
19ee0 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
19ef0 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
19f00 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
19f10 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
19f20 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
19f30 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
19f40 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
19f50 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
19f60 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
19f70 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
19f80 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
19f90 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
19fa0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19fb0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
19fc0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
19fd0 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
19fe0 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
19ff0 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
1a000 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
1a010 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
1a020 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
1a030 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
1a040 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
1a050 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1a060 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
1a070 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1a080 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1a090 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a0a0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1a0b0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1a0c0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1a0d0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
1a0e0 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1a0f0 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1a100 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
1a110 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
1a120 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1a130 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
1a140 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
1a150 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1a160 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1a170 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1a180 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
1a190 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
1a1a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
1a1b0 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
1a1c0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1a1d0 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
1a1e0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1a1f0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
1a200 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
1a210 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
1a220 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1a230 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1a240 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1a250 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
1a260 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1a270 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1a280 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1a290 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1a2a0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
1a2b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1a2c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1a2d0 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
1a2e0 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
1a2f0 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
1a300 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
1a310 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
1a320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a330 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a340 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
1a350 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1a360 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
1a370 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
1a380 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1a390 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a3a0 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
1a3b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a3c0 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
1a3d0 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
1a3e0 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
1a3f0 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
1a400 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1a410 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1a420 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
1a430 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
1a440 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
1a450 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1a460 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
1a470 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
1a480 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
1a490 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
1a4a0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
1a4b0 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
1a4c0 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
1a4d0 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
1a4e0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
1a4f0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1a500 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
1a510 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
1a520 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
1a530 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
1a540 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
1a550 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
1a560 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
1a570 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
1a580 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
1a590 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
1a5a0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
1a5b0 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
1a5c0 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
1a5d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
1a5e0 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
1a5f0 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
1a600 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
1a610 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a620 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
1a630 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
1a640 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
1a650 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
1a660 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
1a670 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
1a680 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
1a690 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1a6a0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
1a6b0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1a6c0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
1a6d0 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
1a6e0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
1a6f0 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
1a700 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
1a710 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1a720 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
1a730 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
1a740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a750 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
1a760 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
1a770 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
1a780 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
1a790 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1a7a0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1a7b0 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
1a7c0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
1a7d0 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
1a7e0 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
1a7f0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
1a800 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
1a810 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1a820 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
1a830 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
1a840 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
1a850 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
1a860 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
1a870 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
1a880 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
1a890 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
1a8a0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
1a8b0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
1a8c0 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
1a8d0 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
1a8e0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
1a8f0 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
1a900 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
1a910 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
1a920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a930 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1a940 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
1a950 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a960 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
1a970 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1a980 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
1a990 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a9a0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a9b0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a9c0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1a9d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a9e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a9f0 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
1aa00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1aa10 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1aa20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1aa30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
1aa40 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
1aa50 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1aa60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1aa70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1aa80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1aa90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1aaa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aab0 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
1aac0 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1aad0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1aae0 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
1aaf0 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
1ab00 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1ab10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ab20 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1ab30 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
1ab40 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
1ab50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1ab60 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1ab70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ab80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ab90 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1aba0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
1abb0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
1abc0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
1abd0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
1abe0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
1abf0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1ac00 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
1ac10 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
1ac20 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
1ac30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1ac40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1ac50 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
1ac60 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1ac70 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
1ac80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ac90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
1aca0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1acb0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
1acc0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1acd0 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
1ace0 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
1acf0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1ad00 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
1ad10 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
1ad20 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
1ad30 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
1ad40 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
1ad50 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
1ad60 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
1ad70 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
1ad80 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
1ad90 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
1ada0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1adb0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
1adc0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1add0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1ade0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1adf0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
1ae00 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
1ae10 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
1ae20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
1ae30 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
1ae40 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
1ae50 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1ae60 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
1ae70 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
1ae80 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1ae90 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
1aea0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
1aeb0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1aec0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
1aed0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
1aee0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
1aef0 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
1af00 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
1af10 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1af20 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
1af30 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
1af40 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1af50 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
1af60 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
1af70 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
1af80 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1af90 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
1afa0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1afb0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1afc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1afd0 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
1afe0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1aff0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1b000 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
1b010 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
1b020 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
1b030 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
1b040 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1b050 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
1b060 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1b070 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
1b080 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1b090 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
1b0a0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1b0b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1b0c0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1b0d0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
1b0e0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
1b0f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
1b100 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
1b110 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
1b120 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1b130 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
1b140 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1b150 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
1b160 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
1b170 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
1b180 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
1b190 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1b1a0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
1b1b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1b1c0 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
1b1d0 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
1b1e0 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
1b1f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
1b200 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
1b210 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
1b220 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
1b230 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
1b240 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
1b250 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
1b260 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
1b270 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
1b280 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
1b290 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
1b2a0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
1b2b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
1b2c0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
1b2d0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
1b2e0 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
1b2f0 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
1b300 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
1b310 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1b320 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1b330 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
1b340 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
1b350 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
1b360 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
1b370 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1b380 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
1b390 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
1b3a0 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
1b3b0 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
1b3c0 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
1b3d0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
1b3e0 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
1b3f0 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
1b400 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
1b410 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
1b420 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1b430 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1b440 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1b450 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1b460 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
1b470 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
1b480 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
1b490 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
1b4a0 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
1b4b0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
1b4c0 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
1b4d0 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
1b4e0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
1b4f0 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
1b500 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
1b510 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
1b520 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
1b530 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
1b540 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1b550 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
1b560 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
1b570 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
1b580 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
1b590 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
1b5a0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
1b5b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1b5c0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1b5d0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1b5e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1b5f0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1b600 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1b610 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1b620 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1b630 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b640 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b650 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
1b660 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
1b670 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1b680 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
1b690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b6a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b6b0 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
1b6c0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
1b6d0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1b6e0 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
1b6f0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
1b700 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
1b710 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
1b720 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
1b730 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1b740 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
1b750 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1b760 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1b770 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1b780 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
1b790 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b7a0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1b7b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1b7c0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1b7d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1b7e0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
1b7f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b800 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b810 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
1b820 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b830 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
1b840 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
1b850 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b860 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
1b870 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b880 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1b890 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1b8a0 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
1b8b0 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
1b8c0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1b8d0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1b8e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b8f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b910 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
1b920 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
1b930 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b940 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
1b950 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1b960 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b970 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1b980 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b990 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
1b9a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1b9b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1b9c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1b9d0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
1b9e0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
1b9f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1ba00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ba10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ba20 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
1ba30 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
1ba40 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
1ba50 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
1ba60 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
1ba70 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
1ba80 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
1ba90 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
1baa0 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
1bab0 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
1bac0 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
1bad0 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
1bae0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1baf0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
1bb00 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
1bb10 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
1bb20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
1bb30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bb40 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
1bb50 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1bb60 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
1bb70 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
1bb80 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
1bb90 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
1bba0 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
1bbb0 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
1bbc0 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
1bbd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
1bbe0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1bbf0 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
1bc00 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
1bc10 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
1bc20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
1bc30 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
1bc40 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1bc50 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
1bc60 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
1bc70 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
1bc80 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1bc90 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
1bca0 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
1bcb0 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
1bcc0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66  tCursor *p;.  if
1bcd0 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72 65  ( pBtree==0 ) re
1bce0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  turn;.  sqlite3B
1bcf0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1bd00 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
1bd10 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1bd20 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1bd30 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1bd40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1bd50 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
1bd60 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
1bd70 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
1bd80 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
1bd90 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
1bda0 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
1bdb0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1bdc0 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
1bdd0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
1bde0 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
1bdf0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1be00 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1be10 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
1be20 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
1be30 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1be40 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
1be50 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
1be60 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
1be70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
1be80 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
1be90 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
1bea0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
1beb0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
1bec0 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
1bed0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
1bee0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
1bef0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1bf00 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1bf10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bf20 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1bf30 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1bf40 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1bf50 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1bf60 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1bf70 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
1bf80 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
1bf90 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e   tripCode){.  in
1bfa0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1bfb0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1bfc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1bfd0 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1;..  sqlite3Btr
1bfe0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
1bff0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
1c000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1c010 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
1c020 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1c030 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 0);.  }else{
1c040 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c050 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
1c060 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 73  ripCode ){.    s
1c070 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1c080 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69  llCursors(p, tri
1c090 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74  pCode);.  }.  bt
1c0a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1c0b0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1c0c0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1c0d0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1c0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
1c0f0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
1c100 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
1c110 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
1c120 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1c130 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1c140 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
1c150 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1c160 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
1c170 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
1c180 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
1c190 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
1c1a0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
1c1b0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
1c1c0 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
1c1d0 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
1c1e0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
1c1f0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
1c200 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
1c210 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
1c220 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
1c230 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
1c240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c250 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
1c260 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
1c270 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
1c280 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
1c290 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
1c2a0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
1c2b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1c2c0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1c2d0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
1c2e0 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
1c2f0 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
1c300 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1c310 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
1c320 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1c330 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
1c340 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
1c350 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
1c360 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
1c370 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1c380 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1c390 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1c3a0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1c3b0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1c3c0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1c3d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c3e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c3f0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
1c400 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
1c410 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1c420 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
1c430 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
1c440 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
1c450 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
1c460 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
1c470 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
1c480 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
1c490 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
1c4a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1c4b0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1c4c0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
1c4d0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
1c4e0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1c4f0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
1c500 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
1c510 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
1c520 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
1c530 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
1c540 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
1c550 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
1c560 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
1c570 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
1c580 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
1c590 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
1c5a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
1c5b0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
1c5c0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
1c5d0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
1c5e0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
1c5f0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
1c600 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
1c610 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
1c620 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1c630 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
1c640 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
1c650 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1c660 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
1c670 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
1c680 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
1c690 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1c6a0 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
1c6b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
1c6c0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
1c6d0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
1c6e0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1c6f0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
1c700 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
1c710 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1c720 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
1c730 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
1c740 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
1c750 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
1c760 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
1c770 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
1c780 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
1c790 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
1c7a0 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
1c7b0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1c7c0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
1c7d0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1c7e0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
1c7f0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
1c800 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
1c810 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1c820 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1c830 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1c840 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1c850 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
1c860 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1c870 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
1c880 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1c890 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
1c8a0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1c8b0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
1c8c0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
1c8d0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
1c8e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1c8f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c900 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1c910 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
1c920 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
1c930 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1c940 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
1c950 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
1c960 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
1c970 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
1c980 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
1c990 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
1c9a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
1c9b0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
1c9c0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
1c9d0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
1c9e0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
1c9f0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
1ca00 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1ca10 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
1ca20 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
1ca30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1ca40 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1ca50 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
1ca60 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
1ca70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1ca80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ca90 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1caa0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1cab0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1cac0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1cad0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1cae0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1caf0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1cb00 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1cb10 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1cb20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1cb30 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1cb40 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1cb50 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1cb60 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1cb70 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1cb80 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1cb90 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1cba0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1cbb0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1cbc0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1cbd0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1cbe0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1cbf0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1cc00 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1cc10 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1cc20 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1cc30 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1cc40 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1cc50 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1cc60 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1cc70 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1cc80 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1cc90 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1cca0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1ccb0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1ccc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ccd0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1cce0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1ccf0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1cd00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cd10 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1cd20 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1cd30 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1cd40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1cd50 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1cd60 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1cd70 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1cd80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1cd90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1cda0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1cdb0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1cdc0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1cdd0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1cde0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1cdf0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1ce00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1ce10 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1ce20 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1ce30 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1ce40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ce50 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
1ce60 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
1ce70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
1ce80 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
1ce90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
1cea0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
1ceb0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1cec0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1ced0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1cee0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1cef0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
1cf00 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
1cf10 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
1cf20 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
1cf30 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
1cf40 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
1cf50 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
1cf60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1cf70 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
1cf80 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
1cf90 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
1cfa0 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
1cfb0 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
1cfc0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
1cfd0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
1cfe0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1cff0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1d000 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1d010 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
1d020 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
1d030 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
1d040 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
1d050 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
1d060 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
1d070 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1d080 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1d090 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
1d0a0 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
1d0b0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1d0c0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
1d0d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1d0e0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
1d0f0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
1d100 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
1d110 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1d120 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
1d130 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
1d140 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1d150 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
1d160 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1d170 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
1d180 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
1d190 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
1d1a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1d1b0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1d1c0 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
1d1d0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
1d1e0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
1d1f0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
1d200 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
1d210 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
1d220 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
1d230 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
1d240 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
1d250 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
1d260 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
1d270 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
1d280 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
1d290 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
1d2a0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1d2b0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
1d2c0 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
1d2d0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
1d2e0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
1d2f0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
1d300 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
1d310 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
1d320 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
1d330 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
1d340 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
1d350 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
1d360 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
1d370 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
1d380 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
1d390 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
1d3a0 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
1d3b0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
1d3c0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1d3d0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
1d3e0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
1d3f0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
1d400 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
1d410 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
1d420 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
1d430 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
1d440 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
1d450 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
1d460 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
1d470 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
1d480 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
1d490 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
1d4a0 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
1d4b0 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
1d4c0 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
1d4d0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
1d4e0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
1d4f0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1d500 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1d510 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1d520 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1d530 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
1d540 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1d550 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
1d560 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1d570 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1d580 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1d590 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1d5a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1d5d0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1d600 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1d610 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1d620 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1d650 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1d660 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1d670 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1d680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1d690 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1d6a0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1d6b0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1d6c0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1d6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1d6e0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1d6f0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1d700 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1d710 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1d720 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1d730 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1d740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1d750 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1d760 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1d770 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1d780 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1d790 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1d7a0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1d7b0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1d7c0 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1d7d0 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1d7e0 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1d7f0 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1d800 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1d810 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1d820 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1d830 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1d840 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1d850 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1d860 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1d870 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1d880 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1d890 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1d8a0 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1d8b0 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1d8c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1d8d0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1d8e0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1d8f0 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1d900 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1d910 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1d920 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1d930 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1d940 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1d950 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1d960 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1d970 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1d980 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1d9a0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1d9b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1d9c0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1d9d0 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e  wrFlag && (pBt->
1d9e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1d9f0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b  EAD_ONLY)!=0) ){
1da00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1da10 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1da20 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1da30 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
1da40 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1da50 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1da60 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
1da70 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1da80 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1da90 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1daa0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1dab0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1dac0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1dad0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1dae0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1daf0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1db00 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1db10 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1db20 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1db30 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1db40 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1db50 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1db60 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1db70 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73  >pBt = pBt;.  as
1db80 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1db90 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f  || wrFlag==BTCF_
1dba0 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70  WriteFlag );.  p
1dbb0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
1dbc0 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
1dbd0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
1dbe0 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
1dbf0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1dc00 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1dc10 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
1dc20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1dc30 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
1dc40 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1dc50 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
1dc60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1dc70 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1dc80 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1dcc0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1dd00 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1dd10 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd40 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1dd50 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1dd60 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1dd70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1dd80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1dd90 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1dda0 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1ddb0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1dde0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1ddf0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1de00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1de10 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1de20 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1de30 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1de40 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1de50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1de60 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1de70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1de80 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1de90 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1dea0 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1deb0 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1dec0 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1ded0 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1dee0 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1def0 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1df00 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1df10 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1df20 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1df30 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1df40 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1df50 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1df60 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1df70 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1df80 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1df90 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1dfa0 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1dfb0 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1dfc0 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
1dfd0 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
1dfe0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1dff0 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1e000 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1e010 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
1e020 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
1e030 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
1e040 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
1e050 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
1e060 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
1e070 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
1e080 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
1e090 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
1e0a0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
1e0b0 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
1e0c0 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
1e0d0 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
1e0e0 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
1e0f0 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
1e100 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
1e110 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1e120 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
1e130 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
1e140 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1e150 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
1e160 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1e170 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
1e180 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
1e190 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1e1a0 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1e1b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1e1c0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1e1d0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1e1e0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1e1f0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1e200 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1e210 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1e220 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1e230 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1e240 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1e250 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1e260 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1e270 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1e280 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1e290 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1e2a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1e2b0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1e2c0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1e2d0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1e2e0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1e2f0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1e300 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1e310 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1e320 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1e330 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e340 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1e350 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1e360 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1e370 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1e380 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1e390 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1e3a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e3b0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1e3c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1e3d0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1e3e0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
1e3f0 65 33 44 62 46 72 65 65 28 70 42 74 72 65 65 2d  e3DbFree(pBtree-
1e400 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72  >db, pCur->aOver
1e410 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
1e420 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1e430 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1e440 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1e450 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1e460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e470 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1e480 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
1e490 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1e4a0 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
1e4b0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1e4c0 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
1e4d0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1e4e0 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
1e4f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1e500 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
1e510 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
1e520 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
1e530 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
1e540 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1e550 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
1e560 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
1e570 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1e580 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
1e590 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
1e5a0 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
1e5b0 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
1e5c0 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
1e5d0 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
1e5e0 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
1e5f0 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
1e600 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
1e610 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1e620 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
1e630 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
1e640 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
1e650 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
1e660 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
1e670 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
1e680 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
1e690 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
1e6a0 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
1e6b0 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
1e6c0 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
1e6d0 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
1e6e0 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
1e6f0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
1e700 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
1e710 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
1e720 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
1e730 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
1e740 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1e750 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1e760 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
1e770 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1e780 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1e790 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1e7a0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1e7b0 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
1e7c0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
1e7d0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1e7e0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1e7f0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1e800 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1e810 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1e820 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
1e830 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1e840 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1e850 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1e860 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1e870 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1e880 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1e890 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1e8a0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1e8b0 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1e8c0 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1e8d0 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1e8e0 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1e8f0 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1e900 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e910 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1e920 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1e930 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1e940 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1e950 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1e960 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1e970 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1e980 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1e990 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1e9a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
1e9b0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
1e9c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e9d0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1e9e0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1e9f0 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1ea00 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1ea10 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1ea20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1ea30 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1ea40 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1ea50 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1ea60 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
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 20 20                  
1eaa0 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1eab0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1eac0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1eb00 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1eb10 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1eb50 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1eb60 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1eb70 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1eb80 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1eb90 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70  ;        \.    p
1eba0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
1ebb0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
1ebf0 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1ec40 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1ec50 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ec90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
1eca0 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _VER */..#ifndef
1ecb0 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
1ecc0 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
1ecd0 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1ece0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1ecf0 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
1ed00 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
1ed10 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
1ed20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
1ed30 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
1ed40 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
1ed50 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
1ed60 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
1ed70 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
1ed80 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
1ed90 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
1eda0 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
1edb0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1edc0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
1edd0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1ede0 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
1edf0 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1ee00 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
1ee10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ee20 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
1ee30 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
1ee40 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1ee50 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1ee60 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
1ee70 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
1ee80 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
1ee90 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1eea0 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
1eeb0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1eec0 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
1eed0 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
1eee0 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
1eef0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
1ef00 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
1ef10 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
1ef20 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ef30 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
1ef40 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
1ef50 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1ef60 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1ef70 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
1ef80 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
1ef90 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
1efa0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1efb0 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
1efc0 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1efd0 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
1efe0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1eff0 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
1f000 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
1f010 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
1f020 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
1f030 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1f040 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1f050 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1f060 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1f070 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
1f080 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f090 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
1f0a0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1f0b0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
1f0c0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pSize = 0;.  }el
1f0d0 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49  se{.    getCellI
1f0e0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a  nfo(pCur);.    *
1f0f0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1f100 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  fo.nKey;.  }.  r
1f110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1f130 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1f140 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1f150 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1f160 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1f170 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1f180 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
1f190 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
1f1a0 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
1f1b0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1f1c0 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
1f1d0 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
1f1e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1f1f0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1f200 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
1f210 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
1f220 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
1f230 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
1f240 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
1f250 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1f260 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
1f270 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
1f280 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1f290 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
1f2a0 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
1f2b0 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
1f2c0 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
1f2d0 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
1f2e0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1f2f0 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
1f300 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
1f310 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
1f320 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1f330 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1f340 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1f350 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1f360 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1f370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f380 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f390 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
1f3a0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f3b0 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1f3c0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65  info.nData;.  re
1f3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f3e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1f3f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1f400 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
1f410 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1f420 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
1f430 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
1f440 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
1f450 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f460 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1f470 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
1f480 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
1f490 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
1f4a0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
1f4b0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
1f4c0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
1f4d0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
1f4e0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
1f4f0 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
1f500 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
1f510 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1f520 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f530 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1f540 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
1f550 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
1f560 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
1f570 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1f580 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1f590 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
1f5a0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
1f5b0 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
1f5c0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
1f5d0 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
1f5e0 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
1f5f0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
1f600 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
1f610 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
1f620 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1f630 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
1f640 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
1f650 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
1f660 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
1f670 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
1f680 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
1f690 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
1f6a0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
1f6b0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1f6c0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1f6d0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
1f6e0 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
1f6f0 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
1f700 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
1f710 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
1f720 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
1f730 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
1f740 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
1f750 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
1f760 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
1f770 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
1f780 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
1f790 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1f7a0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1f7b0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1f7c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f7d0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f7e0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1f7f0 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
1f800 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1f810 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1f820 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
1f830 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1f840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1f850 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
1f860 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
1f870 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
1f880 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
1f890 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
1f8a0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
1f8b0 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
1f8c0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
1f8d0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
1f8e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f8f0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1f900 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f910 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1f920 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
1f930 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
1f940 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f950 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
1f960 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
1f970 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1f980 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
1f990 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
1f9a0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
1f9b0 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
1f9c0 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
1f9d0 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
1f9e0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
1f9f0 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
1fa00 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
1fa10 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
1fa20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
1fa30 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
1fa40 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
1fa50 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
1fa60 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
1fa70 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
1fa80 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
1fa90 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1faa0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1fab0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
1fac0 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
1fad0 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
1fae0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
1faf0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1fb00 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
1fb10 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
1fb20 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1fb30 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
1fb40 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
1fb50 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
1fb60 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
1fb70 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1fb80 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
1fb90 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
1fba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fbb0 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
1fbc0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1fbd0 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
1fbe0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
1fbf0 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
1fc00 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1fc10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fc20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1fc30 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
1fc40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1fc50 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1fc60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fc70 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1fc80 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
1fc90 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
1fca0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
1fcb0 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
1fcc0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1fcd0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
1fce0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1fcf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fd00 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
1fd10 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1fd20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
1fd30 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
1fd40 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
1fd50 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
1fd60 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
1fd70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1fd80 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
1fd90 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
1fda0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
1fdb0 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
1fdc0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1fdd0 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
1fde0 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
1fdf0 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
1fe00 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
1fe10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1fe20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
1fe30 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1fe40 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
1fe50 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
1fe60 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
1fe70 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
1fe80 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
1fe90 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
1fea0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
1feb0 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
1fec0 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
1fed0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1fee0 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1fef0 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
1ff00 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
1ff10 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1ff20 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1ff30 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
1ff40 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1ff50 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
1ff60 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
1ff70 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
1ff80 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
1ff90 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
1ffa0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
1ffb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1ffc0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
1ffd0 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
1ffe0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1fff0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20000 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
20010 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
20020 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20030 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
20040 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
20070 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
20080 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
20090 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
200a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
200b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
200c0 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
200d0 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
200e0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
200f0 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
20100 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
20110 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
20120 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20130 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
20140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
20160 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20170 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
20180 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
20190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
201a0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
201b0 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
201c0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
201d0 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
201e0 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
201f0 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
20200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20210 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20220 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
20230 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
20240 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
20250 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
20260 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
20270 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
20280 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
20290 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
202a0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
202b0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
202c0 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
202d0 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
202e0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
202f0 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
20300 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
20310 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
20320 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
20330 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
20340 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
20350 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
20360 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
20370 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
20380 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
20390 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
203a0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
203b0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
203c0 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
203d0 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
203e0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
203f0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
20400 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
20410 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
20420 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
20430 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
20440 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
20450 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
20460 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
20470 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
20480 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
20490 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
204a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
204b0 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
204c0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
204d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
204e0 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
204f0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
20500 79 20 0a 2a 2a 20 70 6f 70 6c 75 61 74 65 73 20  y .** popluates 
20510 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
20520 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
20530 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
20540 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
20550 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
20560 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
20570 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
20580 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
20590 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
205a0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
205b0 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
205c0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
205d0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
205e0 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
205f0 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
20600 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
20610 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
20620 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
20630 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
20640 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
20650 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
20660 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
20670 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
20680 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
20690 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
206a0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
206b0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
206c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
206d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
206e0 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
206f0 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
20700 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
20710 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
20720 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
20730 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
20740 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
20750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
20760 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
20770 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
20780 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
20790 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
207a0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
207b0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
207c0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
207d0 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
207e0 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
207f0 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
20800 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
20810 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
20820 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
20830 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
20840 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
20850 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
20860 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
20870 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
20880 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
20890 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
208a0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
208b0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
208c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
208d0 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
208e0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
208f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
20900 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
20910 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
20920 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
20930 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
20940 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20950 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20970 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
20980 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
20990 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
209a0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
209b0 41 44 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  AD.  int bEnd;  
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
209f0 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61  ing to end of da
20a00 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ta */.#endif..  
20a10 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
20a20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20a30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20a40 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
20a50 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20a60 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
20a70 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
20a80 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20a90 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20aa0 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
20ab0 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b   || offset==0 );
20ac0 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20        /* Always 
20ad0 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
20ae0 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
20af0 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
20b00 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
20b10 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
20b20 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
20b30 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
20b40 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
20b50 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
20b60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
20b70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20b80 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
20b90 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 28 6f  READ.  bEnd = (o
20ba0 66 66 73 65 74 2b 61 6d 74 3d 3d 6e 4b 65 79 2b  ffset+amt==nKey+
20bb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
20bc0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
20bd0 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d   NEVER(offset+am
20be0 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
20bf0 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c  nfo.nData) .   |
20c00 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  | &aPayload[pCur
20c10 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
20c20 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
20c30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
20c40 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69    ){.    /* Tryi
20c50 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
20c60 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
20c70 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
20c80 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
20c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20ca0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20cb0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
20cc0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
20cd0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
20ce0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
20cf0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
20d00 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
20d10 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
20d20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
20d30 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
20d40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20d50 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
20d60 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20d70 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
20d80 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
20d90 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
20da0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
20db0 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70   (eOp & 0x01), p
20dc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20dd0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
20de0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
20df0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
20e00 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
20e10 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
20e20 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
20e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20e40 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
20e50 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
20e60 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
20e70 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
20e80 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
20e90 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
20ea0 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
20eb0 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
20ec0 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
20ed0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
20ee0 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
20ef0 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
20f00 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
20f10 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
20f20 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
20f30 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  now..    ** Exce
20f40 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63  pt, do not alloc
20f50 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  ate aOverflow[] 
20f60 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20  for eOp==2..    
20f70 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
20f80 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
20f90 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
20fa0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
20fb0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
20fc0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
20fd0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
20fe0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
20ff0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
21000 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
21010 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
21020 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
21030 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
21040 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
21050 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
21060 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
21070 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
21080 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
21090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
210a0 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d  eOp!=2 && (pCur-
210b0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
210c0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
210d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
210e0 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
210f0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
21100 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
21110 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
21120 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
21130 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
21140 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
21150 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
21160 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  )sqlite3DbReallo
21170 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
21180 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2c  Cur->pBtree->db,
21190 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
211a0 2c 20 28 69 36 34 29 6e 4f 76 66 6c 2a 32 2a 73  , (i64)nOvfl*2*s
211b0 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
211c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
211d0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
211e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
211f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21210 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
21220 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
21230 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
21240 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
21250 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21260 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
21270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21280 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43         memset(pC
21290 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30  ur->aOverflow, 0
212a0 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50  , nOvfl*sizeof(P
212b0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gno));.        p
212c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
212d0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
212e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
212f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
21300 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
21310 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
21320 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
21330 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
21340 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
21350 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
21360 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
21370 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
21380 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
21390 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
213a0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
213b0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 26 26  ValidOvfl)!=0 &&
213c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
213d0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
213e0 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
213f0 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
21400 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
21410 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
21420 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
21430 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
21440 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
21450 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
21460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21470 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
21480 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
21490 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
214a0 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
214b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
214c0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
214d0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
214e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
214f0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
21500 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21510 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
21520 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
21530 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
21540 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
21550 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
21560 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
21570 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
21580 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
21590 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
215a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
215b0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
215c0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
215d0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
215e0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
215f0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
21600 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
21610 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
21620 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
21630 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
21640 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
21650 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
21660 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
21670 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
21680 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
21690 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
216a0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
216b0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
216c0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
216d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
216e0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
216f0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
21700 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
21710 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
21720 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
21730 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
21740 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
21750 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
21760 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
21770 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21780 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
21790 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
217a0 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
217b0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
217c0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
217d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
217e0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
217f0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21800 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
21810 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
21820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21830 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
21840 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
21850 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
21860 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
21870 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
21880 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
21890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
218a0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
218b0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
218c0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
218d0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
218e0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
218f0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
21900 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
21910 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
21920 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
21930 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21940 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
21950 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
21960 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
21970 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
21980 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
21990 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
219a0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
219b0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
219c0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
219d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
219e0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
219f0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
21a00 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
21a10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21a20 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
21a30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
21a40 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
21a50 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
21a60 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
21a70 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
21a80 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
21a90 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
21aa0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
21ab0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
21ac0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
21ad0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
21ae0 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
21af0 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
21b00 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
21b10 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
21b20 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
21b30 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
21b40 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
21b50 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64     **   6) all d
21b60 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ata from the pag
21b70 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e  e is being read.
21b80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
21b90 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
21ba0 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
21bb0 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
21bc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
21bd0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
21be0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
21bf0 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
21c00 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
21c10 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
21c20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
21c30 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
21c40 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
21c50 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
21c60 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
21c70 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26         if( (eOp&
21c80 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20  0x01)==0        
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21cb0 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
21cc0 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cf0 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
21d00 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45  .         && (bE
21d10 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a  nd || a==ovflSiz
21d20 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e)              
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  /* (6) */.      
21d50 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
21d60 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21d70 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
21d80 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20           /* (4) 
21d90 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
21da0 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
21db0 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
21dc0 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
21dd0 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
21de0 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61       && pBt->pPa
21df0 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d  ge1->aData[19]==
21e00 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20  0x01            
21e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35             /* (5
21e20 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
21e30 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
21e40 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
21e50 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
21e60 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
21e70 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
21e80 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
21e90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21ea0 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
21eb0 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
21ec0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
21ed0 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
21ee0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
21ef0 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
21f00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
21f10 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
21f20 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
21f30 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
21f40 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
21f50 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
21f60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
21f70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
21f80 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
21f90 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
21fa0 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
21fb0 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29       ((eOp&0x01)
21fc0 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
21fd0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
21fe0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
21ff0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22010 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
22020 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
22030 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
22040 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
22050 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
22060 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
22070 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
22080 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
22090 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
220a0 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c  , a, (eOp&0x01),
220b0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
220c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
220d0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
220e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
220f0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
22100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22110 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
22120 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  a;.        pBuf 
22130 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
22140 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
22150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22160 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
22170 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22180 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
22190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
221a0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
221b0 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
221c0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
221d0 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
221e0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
221f0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
22200 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
22210 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
22220 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
22230 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
22240 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
22250 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
22260 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
22270 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61  row.** in the ta
22280 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ble..**.** Retur
22290 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
222a0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
222b0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
222c0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
222d0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
222e0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
222f0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
22300 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
22310 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
22320 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22330 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
22340 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
22350 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
22360 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
22370 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
22380 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
22390 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
223a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
223b0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
223c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
223d0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
223e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
223f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22400 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22410 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22420 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22430 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
22440 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
22450 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
22460 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
22470 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
22480 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
22490 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
224a0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
224b0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
224c0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
224d0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
224e0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
224f0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
22500 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
22510 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
22520 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22530 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
22540 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
22550 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
22560 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
22570 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
22580 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
22590 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
225a0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
225b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
225c0 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
225d0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
225e0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
225f0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
22600 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
22610 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
22620 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
22630 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
22640 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
22650 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
22660 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
22670 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22680 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22690 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
226a0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
226b0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
226c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
226d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
226e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
226f0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
22700 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
22710 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
22720 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
22730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22740 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22750 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
22760 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22770 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
22780 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
22790 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
227a0 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
227b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
227c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
227d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
227e0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
227f0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
22800 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
22810 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
22820 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
22830 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
22840 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
22850 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
22860 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
22870 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
22880 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
22890 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
228a0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
228b0 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
228c0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
228d0 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
228e0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
228f0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
22900 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
22910 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
22920 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
22930 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
22940 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22950 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
22960 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
22970 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
22980 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
22990 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
229a0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
229b0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
229c0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
229d0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
229e0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
229f0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
22a00 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
22a10 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
22a20 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
22a30 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
22a40 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
22a50 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
22a60 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
22a70 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
22a80 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
22a90 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
22aa0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
22ab0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
22ac0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
22ad0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
22ae0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
22af0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
22b00 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
22b10 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
22b20 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
22b30 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
22b40 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
22b50 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
22b60 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
22b70 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
22b80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
22b90 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
22ba0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
22bb0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
22bc0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
22bd0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
22be0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
22bf0 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
22c00 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
22c10 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
22c20 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
22c30 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43  .){.  assert( pC
22c40 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
22c50 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
22c60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22c70 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
22c80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22c90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
22ca0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22cb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
22cc0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
22cd0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
22ce0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22cf0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
22d00 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
22d10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
22d20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22d30 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
22d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22d50 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
22d60 29 3b 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70  );.#if 0.  if( p
22d70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
22d80 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
22d90 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
22da0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22db0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
22dc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
22df0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 41 6d   }.#endif.  *pAm
22e00 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
22e10 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
22e20 28 76 6f 69 64 2a 29 28 70 43 75 72 2d 3e 69 6e  (void*)(pCur->in
22e30 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
22e40 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 29 3b 0a  >info.nHeader);.
22e50 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
22e60 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
22e70 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
22e80 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
22e90 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
22ea0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
22eb0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
22ec0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
22ed0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
22ee0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
22ef0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
22f00 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
22f10 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
22f20 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
22f30 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
22f40 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
22f50 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
22f60 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
22f70 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
22f80 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
22f90 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
22fa0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
22fb0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
22fc0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
22fd0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
22fe0 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
22ff0 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
23000 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
23010 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
23020 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
23030 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
23040 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
23050 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
23060 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
23070 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
23080 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
23090 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
230a0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
230b0 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
230c0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
230d0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
230e0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
230f0 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76  pAmt);.}.const v
23100 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
23110 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
23120 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
23130 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
23140 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
23150 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
23160 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
23170 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
23180 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
23190 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
231a0 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
231b0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
231c0 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
231d0 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
231e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
231f0 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
23200 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
23210 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
23220 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
23230 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
23240 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
23250 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
23260 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
23270 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
23280 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
23290 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
232a0 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
232b0 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
232c0 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
232d0 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
232e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
232f0 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
23300 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d  nt rc;.  int i =
23310 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
23320 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
23330 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
23340 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
23350 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23360 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23370 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23380 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23390 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
233a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
233b0 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
233c0 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
233d0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
233e0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
233f0 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
23400 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
23410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23420 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23430 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
23440 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
23450 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
23460 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
23470 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c      (pCur->curFl
23480 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
23490 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52  Flag)==0 ? PAGER
234a0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
234b0 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
234c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72  eturn rc;.  pCur
234d0 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20  ->apPage[i+1] = 
234e0 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
234f0 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30  ->aiIdx[i+1] = 0
23500 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
23510 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  +;..  pCur->info
23520 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
23530 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
23540 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
23550 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
23560 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
23570 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65  ->nCell<1 || pNe
23580 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70  wPage->intKey!=p
23590 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
235a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
235b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
235c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
235d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
235e0 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
235f0 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
23600 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
23610 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
23620 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
23630 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
23640 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
23650 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
23660 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
23670 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
23680 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
23690 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
236a0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
236b0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
236c0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
236d0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
236e0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
236f0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
23700 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
23710 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
23720 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
23730 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
23740 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
23750 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ild){.  assert( 
23760 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
23770 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
23780 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
23790 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
237a0 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
237b0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
237c0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
237d0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
237e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
237f0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
23800 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
23810 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
23820 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
23830 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
23840 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
23850 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
23860 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
23870 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
23880 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
23890 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
238a0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
238b0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
238c0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
238d0 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
238e0 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
238f0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
23900 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
23910 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
23920 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
23930 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
23940 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
23950 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
23960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
23970 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
23980 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
23990 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
239a0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
239b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
239c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
239d0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
239e0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
239f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23a00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23a10 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a  >iPage] );..  /*
23a20 20 55 50 44 41 54 45 3a 20 49 74 20 69 73 20 61   UPDATE: It is a
23a30 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  ctually possible
23a40 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69 74 69   for the conditi
23a50 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74 68 65  on tested by the
23a60 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c   assert.  ** bel
23a70 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75 65 20  ow to be untrue 
23a80 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
23a90 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e  file is corrupt.
23aa0 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20   This can occur 
23ab0 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73  if.  ** one curs
23ac0 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65 64 20  or has modified 
23ad0 70 61 67 65 20 70 50 61 72 65 6e 74 20 77 68 69  page pParent whi
23ae0 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  le a reference t
23af0 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a 20 20  o it is held .  
23b00 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64 20 63  ** by a second c
23b10 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63 61 6e  ursor. Which can
23b20 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
23b30 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 69 73  a single page is
23b40 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74   linked.  ** int
23b50 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
23b60 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
23b70 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
23b80 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20  tabase.  */.#if 
23b90 30 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  0.  assertParent
23ba0 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
23bb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23bc0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
23bd0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23be0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
23bf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23c00 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
23c10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65 73 74  );.#endif.  test
23c20 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
23c30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
23c40 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
23c50 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
23c60 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65  nCell );..  rele
23c70 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
23c80 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23c90 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  ]);.  pCur->iPag
23ca0 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  e--;.  pCur->inf
23cb0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
23cc0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
23cd0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
23ce0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
23cf0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
23d00 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
23d10 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
23d20 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
23d30 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
23d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
23d50 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
23d60 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
23d70 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
23d80 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
23d90 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
23da0 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
23db0 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
23dc0 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
23dd0 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
23de0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
23df0 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
23e00 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
23e10 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
23e20 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
23e30 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
23e40 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
23e50 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
23e60 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
23e70 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
23e80 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
23e90 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
23ea0 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
23eb0 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
23ec0 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  D. Otherwise, th
23ed0 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20  e cursor is set 
23ee0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
23ef0 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f  first.** cell lo
23f00 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  cated on the roo
23f10 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f  t (or virtual ro
23f20 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65  ot) page and the
23f30 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a   cursor state.**
23f40 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
23f50 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49  R_VALID..**.** I
23f60 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
23f70 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
23f80 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20  ully, it may be 
23f90 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
23fa0 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20  .** page-header 
23fb0 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74  flags indicate t
23fc0 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c  hat the [virtual
23fd0 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74  ] root-page is t
23fe0 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
23ff0 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70  kind of b-tree p
24000 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65  age (i.e. if whe
24010 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75  n opening the cu
24020 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20  rsor the caller 
24030 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69  did not.** speci
24040 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  fy a KeyInfo str
24050 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
24060 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
24070 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a  0x05 or 0x0D,.**
24080 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61   indicating a ta
24090 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69  ble b-tree, or i
240a0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  f the caller did
240b0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
240c0 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
240d0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
240e0 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f  is set to 0x02 o
240f0 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69  r 0x0A, indicati
24100 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62  ng an index.** b
24110 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  -tree)..*/.stati
24120 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
24130 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24140 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
24150 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
24160 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
24170 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24180 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24190 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
241a0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
241b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
241c0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
241d0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
241e0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
241f0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
24200 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
24210 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
24220 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
24230 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
24240 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
24250 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
24260 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
24270 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24280 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
24290 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
242a0 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
242b0 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  skipNext;.    }.
242c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
242d0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
242e0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
242f0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
24300 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
24310 3e 69 50 61 67 65 20 29 20 72 65 6c 65 61 73 65  >iPage ) release
24320 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
24330 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
24340 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
24350 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
24360 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
24370 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
24380 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72  VALID;.    retur
24390 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
243a0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67  else{.    rc = g
243b0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
243c0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
243d0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
243e0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
243f0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
24400 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c      (pCur->curFl
24410 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
24420 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52  Flag)==0 ? PAGER
24430 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
24440 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
24450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24460 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24470 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
24480 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
24490 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
244a0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
244b0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
244c0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
244d0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
244e0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
244f0 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
24500 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
24510 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
24520 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
24530 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
24540 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
24550 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
24560 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
24570 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
24580 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
24590 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
245a0 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
245b0 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
245c0 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
245d0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
245e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
245f0 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
24600 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
24610 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
24620 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
24630 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
24640 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
24650 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
24660 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
24670 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
24680 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
24690 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
246a0 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
246b0 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
246c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
246d0 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
246e0 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
246f0 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
24700 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
24710 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
24720 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
24730 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
24740 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
24750 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
24760 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
24770 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
24780 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
24790 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
247a0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
247b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
247c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
247d0 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49    }..  pCur->aiI
247e0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
247f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
24800 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
24810 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
24820 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
24830 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
24840 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  fl);..  if( pRoo
24850 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
24860 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24870 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
24880 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
24890 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
248a0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
248b0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
248c0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
248d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
248e0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
248f0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
24900 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
24910 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
24920 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
24930 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
24940 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
24950 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
24960 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24970 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
24980 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
24990 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
249a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
249b0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
249c0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
249d0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
249e0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
249f0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
24a00 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
24a10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
24a20 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
24a30 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
24a40 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
24a50 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
24a60 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
24a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
24a80 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
24a90 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
24aa0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
24ab0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24ac0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24ad0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
24ae0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24af0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24b00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24b10 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
24b20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
24b30 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
24b40 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24b50 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
24b60 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
24b70 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
24b80 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
24b90 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
24ba0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
24bb0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
24bc0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24bd0 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
24be0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24bf0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
24c00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24c10 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
24c20 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
24c30 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
24c40 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
24c50 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
24c60 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
24c70 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
24c80 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
24c90 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
24ca0 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
24cb0 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
24cc0 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
24cd0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
24ce0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
24cf0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
24d00 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
24d10 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
24d20 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
24d30 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
24d40 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
24d50 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
24d60 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
24d70 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
24d80 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
24d90 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
24da0 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
24db0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
24dc0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
24dd0 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
24de0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
24df0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
24e00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
24e10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
24e20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
24e30 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24e40 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24e50 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24e60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24e70 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
24e80 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
24e90 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
24ea0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
24eb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
24ec0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
24ed0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
24ee0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
24ef0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
24f00 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
24f10 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
24f20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24f30 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
24f40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
24f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
24f60 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24f70 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
24f80 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75  nCell-1;.    pCu
24f90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
24fa0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
24fb0 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56  Flags &= ~BTCF_V
24fc0 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 7d 0a 20 20  alidNKey;.  }.  
24fd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24fe0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
24ff0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
25000 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
25010 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
25020 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
25030 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
25040 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
25050 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
25060 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
25070 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
25080 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
25090 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
250a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
250b0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
250c0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
250d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
250e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
250f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25100 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25110 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
25120 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
25130 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
25140 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
25150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25160 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
25170 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25180 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
25190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
251a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
251b0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
251c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
251d0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
251e0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
251f0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
25200 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
25210 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
25220 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
25230 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
25240 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
25250 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
25260 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25270 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
25280 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
25290 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
252a0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
252b0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
252c0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
252d0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
252e0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
252f0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
25300 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
25310 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
25320 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
25330 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25340 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
25350 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
25360 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
25370 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25380 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
253a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
253b0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
253c0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
253d0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
253e0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
253f0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
25400 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
25410 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
25420 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
25430 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
25440 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25450 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
25460 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25470 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
25480 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
25490 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
254a0 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
254b0 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
254c0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
254d0 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
254e0 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
254f0 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
25500 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
25510 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
25520 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
25530 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
25540 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
25550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
25560 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25570 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
25580 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25590 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
255a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
255b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
255c0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
255d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
255e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
255f0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
25600 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
25610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25620 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
25630 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
25640 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
25650 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25660 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
25670 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25680 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25690 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
256a0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
256b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
256c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
256d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
256e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
256f0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
25700 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
25710 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
25720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25730 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
25740 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
25750 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  st;.      }else{
25760 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
25770 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
25780 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
25790 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .   .    }.  }. 
257a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
257b0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
257c0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
257d0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
257e0 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
257f0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
25800 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
25810 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
25820 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
25830 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
25840 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
25850 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
25860 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
25870 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
25880 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
25890 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
258a0 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
258b0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
258c0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
258d0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
258e0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
258f0 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
25900 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
25910 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
25920 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
25930 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
25940 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
25950 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
25960 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
25970 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
25980 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
25990 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
259a0 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
259b0 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
259c0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
259d0 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
259e0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
259f0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
25a00 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
25a10 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
25a20 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
25a30 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
25a40 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
25a50 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
25a60 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
25a70 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
25a80 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
25a90 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
25aa0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
25ab0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
25ac0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
25ad0 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
25ae0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
25b10 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
25b20 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
25b30 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
25b40 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
25b50 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
25b60 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
25b70 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
25b90 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
25ba0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
25bb0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
25bc0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
25bd0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
25be0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
25bf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
25c00 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
25c10 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
25c20 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
25c30 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
25c40 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
25c50 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
25c60 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
25c70 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
25c80 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
25c90 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
25ca0 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
25cb0 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
25cc0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
25cd0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
25ce0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
25cf0 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
25d00 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
25d10 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
25d20 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
25d30 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
25d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
25d50 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
25d60 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
25d70 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43  nt rc;.  RecordC
25d80 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f  ompare xRecordCo
25d90 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74  mpare;..  assert
25da0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25db0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25dc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25dd0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25de0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25df0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25e00 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
25e10 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
25e20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
25e30 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
25e40 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
25e50 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
25e60 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
25e70 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
25e80 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
25e90 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
25ea0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
25eb0 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
25ec0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25ed0 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72  R_VALID && (pCur
25ee0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25ef0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a  F_ValidNKey)!=0.
25f00 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
25f10 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
25f20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
25f30 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
25f40 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
25f50 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
25f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25f70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
25f80 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25f90 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
25fa0 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
25fb0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
25fc0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
25fd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25fe0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
25ff0 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
26000 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
26010 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
26020 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
26030 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
26040 78 4b 65 79 2d 3e 69 73 43 6f 72 72 75 70 74 20  xKey->isCorrupt 
26050 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
26060 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
26070 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
26080 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
26090 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
260a0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
260b0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
260c0 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
260d0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
260e0 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
260f0 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
26100 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
26110 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
26120 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
26130 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26140 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
26150 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
26160 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26170 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
26180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
26190 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
261a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
261b0 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
261c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
261d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
261e0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
261f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26200 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
26210 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
26220 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
26230 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
26240 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
26250 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
26260 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
26270 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26280 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
26290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
262a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
262b0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
262c0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
262d0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
262e0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
262f0 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
26300 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
26310 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
26320 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
26330 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
26340 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
26370 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
26380 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
26390 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
263a0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
263b0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
263c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
263d0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
263e0 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
263f0 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
26400 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
26410 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
26420 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
26430 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
26440 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
26450 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
26460 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
26470 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
26480 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
26490 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
264a0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
264b0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
264c0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
264d0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
264e0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
264f0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
26500 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
26510 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
26520 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
26530 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
26540 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
26550 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
26560 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
26570 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
26580 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
26590 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
265a0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
265b0 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
265c0 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
265d0 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
265e0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
265f0 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
26600 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
26610 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
26620 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
26630 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26640 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
26650 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
26660 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
26670 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
26680 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
26690 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
266a0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
266b0 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
266c0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
266d0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
266e0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
266f0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
26700 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c  ( 0x80 <= *(pCel
26710 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l++) ){.        
26720 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
26730 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
26740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26750 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
26760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26770 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
26780 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
26790 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
267a0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
267b0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
267c0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
267d0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
267e0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
267f0 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
26800 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26810 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
26820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
26830 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
26840 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
26850 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
26860 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
26870 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
26880 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
26890 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
268a0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
268b0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
268c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
268d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
268e0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
268f0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
26900 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
26910 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
26920 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
26930 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
26940 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
26950 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
26960 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
26970 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
26980 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26990 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
269a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
269b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
269c0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
269d0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
269e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
269f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
26a00 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
26a10 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
26a20 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
26a30 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
26a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
26a50 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
26a60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
26a70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Cell;.        pC
26a80 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
26a90 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
26aa0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
26ab0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
26ac0 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
26ad0 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
26ae0 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
26af0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
26b00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
26b10 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
26b20 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
26b30 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
26b40 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
26b50 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
26b60 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
26b70 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
26b80 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
26b90 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
26ba0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
26bb0 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
26bc0 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
26bd0 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
26be0 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
26bf0 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
26c00 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
26c10 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
26c20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
26c30 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
26c40 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
26c50 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
26c60 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
26c70 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
26c80 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
26c90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43     */.        nC
26ca0 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
26cb0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
26cc0 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  l<=pPage->max1by
26cd0 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  tePayload ){.   
26ce0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
26cf0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
26d00 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
26d10 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
26d20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
26d30 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
26d40 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
26d50 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
26d60 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
26d70 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
26d80 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
26d90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26da0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70  pCell+nCell+1==p
26db0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
26dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
26dd0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
26de0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
26df0 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 2c  ell[1], pIdxKey,
26e00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   0);.        }el
26e10 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
26e20 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
26e30 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
26e40 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
26e50 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
26e60 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
26e70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26e80 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
26e90 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
26ea0 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
26eb0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
26ec0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
26ed0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
26ee0 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
26ef0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
26f00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
26f10 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67  ll+nCell+2==pPag
26f20 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
26f30 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
26f40 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
26f50 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
26f60 5b 32 5d 2c 20 70 49 64 78 4b 65 79 2c 20 30 29  [2], pIdxKey, 0)
26f70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26f80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
26f90 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
26fa0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
26fb0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
26fc0 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
26fd0 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
26fe0 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
26ff0 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
27000 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
27010 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
27020 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
27030 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
27040 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
27050 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
27060 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
27070 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
27080 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
27090 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
270a0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
270b0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
270c0 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
270d0 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
270e0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
270f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
27100 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
27110 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
27120 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
27130 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
27140 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
27150 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
27160 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
27170 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
27180 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
27190 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
271a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
271b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
271c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
271d0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
271e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
271f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
27200 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
27210 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
27220 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
27230 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
27240 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
27250 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
27260 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
27270 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
27280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27290 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
272a0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
272b0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
272c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
272d0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
272e0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
272f0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
27300 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
27310 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
27320 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
27330 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
27340 28 20 70 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72  ( pIdxKey->isCor
27350 72 75 70 74 3d 3d 30 20 7c 7c 20 63 3d 3d 30 20  rupt==0 || c==0 
27360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
27370 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
27380 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
27390 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
273a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
273b0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
273c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
273d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
273e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
273f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
27400 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27410 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
27420 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27430 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
27440 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
27450 28 20 70 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72  ( pIdxKey->isCor
27460 72 75 70 74 20 29 20 72 63 20 3d 20 53 51 4c 49  rupt ) rc = SQLI
27470 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
27480 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
27490 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
274a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
274b0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
274c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
274d0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
274e0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
274f0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
27500 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
27510 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
27520 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
27530 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
27540 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
27550 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
27560 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27570 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
27580 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
27590 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
275a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
275b0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
275c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
275d0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
275e0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
275f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
27600 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
27610 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
27620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27630 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
27640 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
27650 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
27660 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
27670 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
27680 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
27690 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
276a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
276b0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
276c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
276d0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
276e0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
276f0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
27700 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27710 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
27720 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
27730 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
27740 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
27750 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
27760 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
27770 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
27780 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
27790 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
277a0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
277b0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
277c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
277d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
277e0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
277f0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
27800 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
27810 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
27820 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
27830 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
27840 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
27850 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
27860 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
27870 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
27880 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
27890 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
278a0 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
278b0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
278c0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
278d0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
278e0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
278f0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
27900 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
27910 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
27920 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
27930 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
27940 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
27950 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
27960 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
27970 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
27980 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
27990 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
279a0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
279b0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
279c0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
279d0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
279e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
279f0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
27a00 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
27a10 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
27a20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
27a30 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
27a40 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
27a50 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
27a60 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
27a70 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
27a80 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
27a90 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27aa0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
27ab0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
27ac0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
27ad0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
27ae0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
27af0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
27b00 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
27b10 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
27b20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
27b30 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
27b40 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
27b50 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
27b60 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
27b70 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
27b80 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
27b90 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
27ba0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
27bb0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
27bc0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
27bd0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
27be0 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
27bf0 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
27c00 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
27c10 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
27c20 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
27c30 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
27c40 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
27c50 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
27c60 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
27c70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
27c80 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
27c90 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
27ca0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
27cb0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
27cc0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
27cd0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
27ce0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
27cf0 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
27d00 65 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71  ever.).*/.int sq
27d10 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
27d20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
27d30 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
27d40 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
27d50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27d60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
27d70 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
27d80 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
27d90 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
27da0 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
27db0 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
27dc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
27dd0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
27de0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
27df0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  R_VALID );.  if(
27e00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
27e10 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
27e20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
27e30 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
27e40 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
27e50 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
27e60 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
27e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27e80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
27e90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
27ea0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
27eb0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
27ec0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
27ed0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
27ee0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
27ef0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
27f00 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
27f10 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
27f20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27f30 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27f40 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
27f50 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
27f60 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
27f70 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
27f80 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
27f90 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
27fa0 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
27fb0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
27fc0 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   0;.        *pRe
27fd0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
27fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
28000 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
28010 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
28020 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28030 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28040 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
28050 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28060 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
28070 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
28080 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
28090 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
280a0 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
280b0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
280c0 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
280d0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
280e0 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
280f0 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
28100 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
28110 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
28120 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
28130 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
28140 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
28150 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
28160 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
28170 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
28180 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
28190 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
281a0 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
281b0 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
281c0 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
281d0 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
281e0 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
281f0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
28200 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
28210 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
28220 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
28230 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
28240 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 69  idOvfl);.  if( i
28250 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
28260 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
28270 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
28280 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
28290 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
282a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
282b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
282c0 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
282d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2a   rc ){.        *
282e0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
282f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28300 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
28310 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
28320 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
28330 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
28340 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
28350 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
28360 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
28370 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
28380 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
28390 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
283a0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
283b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
283c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
283d0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
283e0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
283f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
28400 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
28410 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
28420 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28430 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
28440 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
28450 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
28460 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
28470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28480 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
28490 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
284a0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
284b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
284c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
284d0 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
284e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
284f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
28510 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
28520 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
28530 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
28540 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
28550 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
28560 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
28570 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
28580 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
28590 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
285a0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
285b0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
285c0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
285d0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
285e0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
285f0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
28600 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
28610 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
28620 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
28630 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
28640 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
28650 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
28660 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
28670 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
28680 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
28690 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
286a0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
286b0 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
286c0 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
286d0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
286e0 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
286f0 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
28700 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
28710 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
28720 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
28730 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
28740 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
28750 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
28760 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
28770 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28780 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
28790 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
287a0 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
287b0 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
287c0 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
287d0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
287e0 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
287f0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
28800 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
28810 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
28820 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
28830 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
28840 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
28850 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
28860 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
28870 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
28880 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
28890 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
288a0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
288b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
288c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
288d0 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
288e0 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
288f0 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
28900 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28910 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
28920 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
28930 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
28940 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28950 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
28960 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
28970 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28980 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
28990 44 20 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57  D ){.    if( ALW
289a0 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
289b0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
289c0 53 45 45 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  SEEK) ){.      r
289d0 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65  c = btreeRestore
289e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
289f0 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cur);.      if( 
28a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28a10 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
28a20 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
28a30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28a40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
28a50 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
28a60 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
28a70 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
28a80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28a90 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
28aa0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
28ab0 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
28ac0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28ad0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
28ae0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
28af0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
28b00 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
28b10 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
28b20 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
28b30 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
28b40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
28b50 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
28b60 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
28b70 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
28b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28b90 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
28ba0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
28bb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
28bc0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28bd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28be0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
28bf0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
28c00 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
28c10 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
28c20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28c30 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
28c40 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
28c50 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
28c60 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
28c70 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
28c80 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
28c90 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
28ca0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
28cb0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
28cc0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
28cd0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
28ce0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28cf0 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
28d00 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
28d10 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
28d20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28d30 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28d40 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
28d50 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
28d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28d70 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
28d80 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
28d90 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
28da0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
28db0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
28dc0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
28dd0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
28de0 4f 76 66 6c 29 3b 0a 0a 20 20 20 20 70 43 75 72  Ovfl);..    pCur
28df0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28e00 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
28e10 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28e20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28e30 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
28e40 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
28e50 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
28e60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
28e70 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
28e80 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
28e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28ea0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
28eb0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
28ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28ed0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
28ee0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
28ef0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
28f00 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
28f10 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
28f20 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
28f30 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
28f40 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
28f50 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
28f60 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
28f70 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
28f80 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
28f90 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
28fa0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
28fb0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
28fc0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
28fd0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
28fe0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
28ff0 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
29000 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
29010 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
29020 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
29030 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
29040 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
29050 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
29060 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
29070 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
29080 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
29090 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
290a0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
290b0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
290c0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
290d0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
290e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
290f0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
29100 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
29110 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
29120 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
29130 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
29140 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
29150 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
29160 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
29170 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
29180 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
29190 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
291a0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
291b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
291c0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
291d0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
291e0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
291f0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
29200 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
29210 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
29220 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
29230 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
29240 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
29250 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
29260 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
29270 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
29280 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
29290 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
292a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
292b0 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
292c0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
292d0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
292e0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
292f0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
29300 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
29310 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
29320 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
29330 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
29340 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29350 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
29360 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
29370 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
29380 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
29390 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
293a0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
293b0 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
293c0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
293d0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
293e0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
293f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
29400 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
29410 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
29420 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
29430 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
29440 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
29450 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
29460 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
29470 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
29480 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
29490 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
294a0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
294b0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
294c0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
294d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
294e0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
294f0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
29500 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
29510 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
29520 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
29530 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
29540 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
29550 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
29560 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
29570 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
29580 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
29590 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
295a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
295b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
295c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
295d0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
295e0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
295f0 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
29600 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
29610 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
29620 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
29630 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
29640 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
29650 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  t);.  n = get4by
29660 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29670 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
29680 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
29690 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
296a0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
296b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
296c0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
296d0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
296e0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
296f0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
29700 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
29710 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
29720 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
29730 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
29740 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
29750 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
29760 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
29770 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
29780 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
29790 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
297a0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
297b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
297c0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
297d0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
297e0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
297f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
29800 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
29810 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
29820 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
29830 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
29840 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
29850 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
29860 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
29870 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
29880 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
29890 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
298a0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
298b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
298c0 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
298d0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
298e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
298f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
29900 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
29910 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
29920 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
29930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29940 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
29950 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
29960 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
29970 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
29980 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29990 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
299a0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
299b0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
299c0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
299d0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
299e0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
299f0 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
29a00 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
29a10 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
29a20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
29a30 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
29a40 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
29a50 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
29a60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
29a70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
29a80 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
29a90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29aa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
29ab0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
29ac0 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
29ad0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
29ae0 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
29af0 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
29b00 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
29b10 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
29b20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
29b30 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
29b40 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
29b50 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
29b60 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
29b70 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
29b80 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
29b90 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
29ba0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
29bb0 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
29bc0 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
29bd0 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
29be0 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
29bf0 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
29c00 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
29c10 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
29c20 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
29c30 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
29c40 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
29c50 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
29c60 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
29c70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29c80 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
29c90 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
29ca0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
29cb0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
29cc0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
29cd0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
29ce0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
29cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29d00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29d10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29d20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
29d30 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
29d40 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
29d50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29d60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
29d70 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
29d80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29d90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
29db0 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
29dc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29dd0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
29de0 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67   );..      k = g
29df0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
29e00 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23  >aData[4]); /* #
29e10 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
29e20 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  is trunk page */
29e30 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
29e40 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
29e50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
29e60 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
29e70 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
29e80 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
29e90 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
29ea0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
29eb0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
29ec0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
29ed0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
29ee0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
29ef0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
29f00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
29f10 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
29f20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29f30 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
29f40 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
29f50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
29f60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
29f70 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
29f80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29f90 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
29fa0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
29fb0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
29fc0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
29fd0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
29fe0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
29ff0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2a000 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2a010 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2a020 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2a030 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2a040 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2a050 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2a060 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2a070 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2a080 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2a090 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2a0a0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2a0b0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2a0c0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2a0d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2a0e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2a0f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2a100 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2a110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a120 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2a130 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2a140 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2a150 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2a160 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2a170 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2a180 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2a190 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2a1a0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2a1b0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2a1c0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2a1d0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2a1e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2a1f0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2a200 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2a210 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2a220 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2a230 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2a240 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2a250 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2a260 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2a270 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a280 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a290 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2a2a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2a2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2a2c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2a2d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2a2e0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
2a2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2a300 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
2a310 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2a320 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2a330 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2a340 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2a350 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2a360 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2a370 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2a380 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2a390 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2a3a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a3b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a3c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a3d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a3f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2a400 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2a410 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2a420 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2a430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a450 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2a460 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2a470 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
2a480 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
2a490 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2a4a0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
2a4b0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
2a4c0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
2a4d0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
2a4e0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
2a4f0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
2a500 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a510 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
2a520 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
2a530 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
2a540 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2a550 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
2a560 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
2a570 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
2a580 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2a590 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2a5a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2a5b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2a5c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2a5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a5e0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
2a5f0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2a600 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2a610 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2a620 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
2a630 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
2a640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a660 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a670 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a680 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a690 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a6a0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
2a6b0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2a6c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2a6d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
2a6f0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
2a700 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
2a710 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2a720 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2a730 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
2a740 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
2a750 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2a760 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2a770 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
2a780 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
2a790 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
2a7a0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2a7b0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
2a7c0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
2a7d0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
2a7e0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
2a7f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2a800 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2a810 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2a820 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2a830 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a840 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2a850 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
2a860 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2a870 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2a880 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
2a890 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2a8a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a8b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a8c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2a8d0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
2a8e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2a8f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2a900 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a910 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a920 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a930 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2a940 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2a950 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
2a960 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2a970 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2a980 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2a990 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2a9a0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2a9b0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2a9c0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2a9d0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
2a9e0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
2a9f0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
2aa00 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
2aa10 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
2aa20 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
2aa30 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
2aa40 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
2aa50 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
2aa60 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
2aa70 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
2aa80 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
2aa90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
2aaa0 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
2aab0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2aac0 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
2aad0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
2aae0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
2aaf0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
2ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
2ab10 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
2ab20 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ab40 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
2ab50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ab60 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2ab80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2ab90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2aba0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
2abb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2abc0 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
2abd0 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
2abe0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2abf0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
2ac00 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2ac10 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
2ac20 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2ac30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
2ac40 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2ac50 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2ac60 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
2ac70 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2ac80 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
2ac90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2aca0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
2acd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ace0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2acf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2ad00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
2ad10 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
2ad20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
2ad30 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2ad40 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2ad50 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
2ad60 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2ad70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2ad80 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
2ad90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2ada0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2adb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2adc0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2add0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2ade0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2adf0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
2ae00 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
2ae10 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
2ae20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
2ae30 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
2ae40 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
2ae50 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2ae60 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
2ae70 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
2ae80 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
2ae90 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
2aea0 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
2aeb0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2aec0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
2aed0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aef0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
2af00 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
2af10 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
2af20 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
2af30 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
2af40 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
2af50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2af60 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2af70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2af80 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2af90 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2afa0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
2afb0 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
2afc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2afd0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
2afe0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
2aff0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
2b000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b010 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
2b020 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
2b030 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
2b040 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
2b050 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
2b060 6e 6f 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  no) ? PAGER_GET_
2b070 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
2b080 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2b090 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2b0a0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2b0b0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
2b0c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b0d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b0e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2b0f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2b100 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2b110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2b120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b140 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2b150 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2b160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b170 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
2b180 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
2b190 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b1a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2b1b0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
2b1c0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
2b1d0 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
2b1e0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
2b1f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
2b200 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
2b210 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
2b220 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
2b230 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
2b240 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
2b250 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
2b260 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
2b270 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
2b280 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
2b290 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
2b2a0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
2b2b0 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
2b2c0 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
2b2d0 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
2b2e0 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
2b2f0 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
2b300 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
2b310 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
2b320 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
2b330 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
2b340 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
2b350 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2b360 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
2b370 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
2b380 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
2b390 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
2b3a0 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2b3b0 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
2b3c0 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
2b3d0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
2b3e0 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
2b3f0 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
2b400 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2b410 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
2b420 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
2b430 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
2b440 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
2b450 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
2b460 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
2b470 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
2b480 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
2b490 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
2b4a0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2b4b0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
2b4c0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
2b4d0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
2b4e0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
2b4f0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
2b500 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
2b510 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
2b520 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2b530 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
2b540 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
2b550 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
2b560 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
2b570 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
2b580 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
2b590 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
2b5a0 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
2b5b0 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
2b5c0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
2b5d0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
2b5e0 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
2b5f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b600 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
2b610 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
2b620 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
2b630 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
2b640 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ) ? PAGER_GET_NO
2b650 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20 20  CONTENT : 0;..  
2b660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b670 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
2b680 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2b690 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2b6a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
2b6b0 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
2b6c0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
2b6d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2b6e0 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
2b6f0 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
2b700 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2b710 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
2b720 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
2b730 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
2b740 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
2b750 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
2b760 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
2b770 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
2b780 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
2b790 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
2b7a0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2b7b0 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
2b7c0 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
2b7d0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
2b7e0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
2b7f0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
2b800 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
2b810 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
2b820 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
2b830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
2b840 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
2b850 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2b860 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
2b870 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
2b880 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
2b890 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
2b8a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2b8b0 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
2b8c0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2b8d0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
2b8e0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2b8f0 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
2b900 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
2b910 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b920 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b940 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
2b950 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2b960 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
2b970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b980 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b990 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
2b9a0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
2b9b0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
2b9c0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2b9d0 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
2b9e0 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
2b9f0 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
2ba00 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
2ba10 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
2ba20 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
2ba30 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
2ba40 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
2ba50 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
2ba60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ba70 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
2ba80 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ba90 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
2baa0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2bab0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2bac0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
2bad0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2bae0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2baf0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2bb00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bb10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2bb20 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
2bb30 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
2bb40 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
2bb50 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
2bb60 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
2bb70 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2bb80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2bb90 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
2bba0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
2bbb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2bbc0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
2bbd0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
2bbe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bbf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
2bc00 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
2bc10 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
2bc20 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
2bc30 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2bc40 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2bc50 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
2bc60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2bc70 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2bc80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
2bc90 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
2bca0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
2bcb0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
2bcc0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2bcd0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
2bce0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2bcf0 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ble((*ppPage)->p
2bd00 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
2bd10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2bd20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bd30 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
2bd40 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
2bd50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
2bd60 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
2bd70 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
2bd80 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2bd90 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
2bda0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
2bdb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
2bdc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2bdd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
2bde0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
2bdf0 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
2be00 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
2be10 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
2be20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
2be30 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
2be40 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2be50 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
2be60 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
2be70 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
2be80 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
2be90 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
2bea0 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
2beb0 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
2bec0 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
2bed0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
2bee0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2bef0 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
2bf00 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
2bf10 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
2bf20 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2bf30 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
2bf40 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
2bf50 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
2bf60 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
2bf70 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
2bf80 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
2bf90 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
2bfa0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2bfb0 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
2bfc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2bfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2bfe0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
2bff0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2c000 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
2c010 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
2c020 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
2c030 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
2c040 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
2c050 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c070 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
2c080 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
2c090 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2c0c0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
2c0d0 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0f0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2c100 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2c110 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
2c120 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c130 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2c140 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2c150 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a  ert( iPage>1 );.
2c160 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
2c170 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
2c180 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
2c190 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
2c1a0 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
2c1b0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
2c1c0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
2c1d0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2c1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
2c1f0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
2c200 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
2c210 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
2c220 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
2c230 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
2c240 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
2c250 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2c260 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2c270 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c280 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2c290 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
2c2a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2c2b0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
2c2c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2c2d0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
2c2e0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
2c2f0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
2c300 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
2c310 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
2c320 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
2c330 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
2c340 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
2c350 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
2c360 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
2c370 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
2c380 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
2c390 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
2c3a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2c3b0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2c3c0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
2c3e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c3f0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2c400 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
2c410 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2c420 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2c430 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
2c440 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
2c450 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
2c460 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2c470 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2c480 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2c490 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
2c4a0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
2c4b0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
2c4c0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
2c4d0 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
2c4e0 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
2c4f0 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
2c500 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
2c510 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
2c520 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
2c530 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
2c540 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2c550 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
2c560 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
2c570 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
2c580 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
2c590 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
2c5a0 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
2c5b0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2c5c0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
2c5d0 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
2c5e0 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
2c5f0 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
2c600 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
2c610 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
2c620 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
2c630 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
2c640 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
2c650 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
2c660 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
2c670 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
2c680 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2c690 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
2c6a0 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
2c6b0 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
2c6c0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
2c6d0 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
2c6e0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
2c6f0 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
2c700 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
2c710 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
2c720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2c730 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
2c740 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
2c750 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
2c760 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2c770 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2c780 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
2c790 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2c7a0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
2c7b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2c7c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c7d0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2c7e0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
2c7f0 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
2c800 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2c810 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
2c820 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
2c830 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
2c840 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
2c850 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
2c860 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
2c870 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2c880 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
2c890 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2c8a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2c8b0 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
2c8c0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2c8d0 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
2c8e0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2c8f0 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
2c900 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
2c910 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
2c920 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
2c930 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
2c940 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2c950 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2c960 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
2c970 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
2c980 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
2c990 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
2c9a0 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
2c9b0 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
2c9c0 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
2c9d0 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
2c9e0 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
2c9f0 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
2ca00 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
2ca10 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
2ca20 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
2ca30 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
2ca40 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
2ca50 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
2ca60 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
2ca70 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
2ca80 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
2ca90 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
2caa0 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
2cab0 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
2cac0 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
2cad0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
2cae0 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
2caf0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2cb00 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
2cb10 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
2cb20 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
2cb30 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
2cb40 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2cb50 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
2cb60 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
2cb70 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
2cb80 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
2cb90 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
2cba0 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
2cbb0 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
2cbc0 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
2cbd0 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
2cbe0 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
2cbf0 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
2cc00 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
2cc10 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
2cc20 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f  e/4-8"..      */
2cc30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2cc40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2cc50 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2cc60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2cc70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cc80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
2cc90 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
2cca0 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
2ccb0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2ccc0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
2ccd0 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
2cce0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
2ccf0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
2cd00 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
2cd10 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
2cd20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2cd30 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
2cd40 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2cd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2cd60 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
2cd70 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
2cd80 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2cd90 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2cda0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
2cdb0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
2cdc0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
2cdd0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
2cde0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2cdf0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
2ce00 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
2ce10 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
2ce20 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
2ce30 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
2ce40 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
2ce50 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
2ce60 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
2ce70 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
2ce80 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
2ce90 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
2cea0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2ceb0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
2cec0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
2ced0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
2cee0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
2cef0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2cf00 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
2cf10 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
2cf20 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
2cf30 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2cf40 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
2cf50 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
2cf60 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
2cf70 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
2cf80 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
2cf90 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2cfa0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
2cfb0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
2cfc0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2cfd0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
2cfe0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2cff0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2d000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d010 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
2d020 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2d030 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
2d040 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
2d050 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2d060 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
2d070 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2d080 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2d090 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
2d0a0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2d0b0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
2d0c0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
2d0d0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
2d0e0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
2d0f0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
2d100 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
2d110 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2d120 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2d130 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
2d140 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
2d150 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2d160 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
2d170 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2d180 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
2d190 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
2d1a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
2d1b0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
2d1c0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
2d1d0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
2d1e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
2d1f0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
2d200 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2d210 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
2d220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d230 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
2d240 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
2d250 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
2d260 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2d270 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2d280 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2d290 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
2d2a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2d2b0 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
2d2c0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
2d2d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2d2e0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2d2f0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2d300 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2d310 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2d320 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
2d330 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
2d340 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2d350 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
2d360 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2d370 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
2d380 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
2d390 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
2d3a0 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
2d3b0 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  w+3 > pPage->aDa
2d3c0 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
2d3d0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2d3e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d3f0 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
2d400 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
2d410 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
2d420 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
2d430 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
2d440 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2d450 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2d460 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
2d470 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
2d480 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2d490 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
2d4a0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
2d4b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
2d4c0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
2d4d0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
2d4e0 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
2d4f0 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
2d500 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
2d510 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
2d520 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
2d530 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2d540 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
2d550 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
2d560 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
2d570 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
2d580 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
2d590 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
2d5a0 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
2d5b0 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
2d5c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
2d5d0 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
2d5e0 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
2d5f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
2d600 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
2d610 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
2d620 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2d630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d640 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d650 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
2d660 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
2d670 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
2d680 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
2d690 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
2d6a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2d6b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d6c0 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
2d6d0 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
2d6e0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2d6f0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
2d700 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
2d710 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2d720 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
2d730 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
2d740 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
2d750 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
2d760 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
2d770 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
2d780 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
2d790 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
2d7a0 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
2d7b0 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
2d7c0 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
2d7d0 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
2d7e0 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
2d7f0 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
2d800 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
2d810 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
2d820 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
2d830 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
2d840 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
2d850 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
2d860 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2d870 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
2d880 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
2d890 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
2d8a0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
2d8b0 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
2d8c0 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
2d8d0 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
2d8e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
2d8f0 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
2d900 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
2d910 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
2d920 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
2d930 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
2d940 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
2d950 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
2d960 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
2d970 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
2d980 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
2d990 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
2d9a0 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
2d9b0 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
2d9c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2d9d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2d9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2d9f0 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
2da00 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
2da10 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2da20 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
2da30 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2da40 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
2da50 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2da60 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2da70 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
2da80 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
2da90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2daa0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2dab0 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
2dac0 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
2dad0 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
2dae0 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
2daf0 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
2db00 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
2db10 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
2db20 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
2db30 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
2db40 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
2db50 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
2db60 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
2db70 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2db80 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
2db90 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
2dba0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
2dbb0 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
2dbc0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2dbd0 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
2dbe0 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
2dbf0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
2dc00 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
2dc10 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
2dc20 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
2dc30 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
2dc40 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
2dc50 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
2dc60 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
2dc70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
2dc80 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
2dc90 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
2dca0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2dcb0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
2dcc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dce0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
2dcf0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
2dd00 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2dd10 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
2dd20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
2dd30 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
2dd40 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
2dd50 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
2dd60 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
2dd70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2dd80 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
2dd90 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
2dda0 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
2ddd0 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
2dde0 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
2ddf0 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
2de20 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
2de30 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
2de40 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
2de50 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
2de60 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
2de70 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
2de80 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
2de90 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
2dea0 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
2deb0 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
2dec0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2ded0 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
2dee0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2def0 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
2df00 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
2df10 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c  t nHeader;.  Cel
2df20 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61  lInfo info;..  a
2df30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2df40 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2df50 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2df60 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
2df70 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
2df80 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
2df90 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
2dfa0 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
2dfb0 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
2dfc0 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
2dfd0 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
2dfe0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
2dff0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
2e000 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
2e010 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2e020 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2e030 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2e040 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e050 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2e060 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
2e070 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
2e080 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
2e090 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
2e0a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
2e0b0 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
2e0c0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
2e0d0 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
2e0e0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
2e0f0 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
2e100 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
2e110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
2e120 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
2e130 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
2e140 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
2e150 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
2e160 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74  64*)&nKey);.  bt
2e170 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2e180 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
2e190 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
2e1a0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48  info.nHeader==nH
2e1b0 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72  eader );.  asser
2e1c0 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
2e1d0 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2e1e0 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32  info.nData==(u32
2e1f0 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29  )(nData+nZero) )
2e200 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
2e210 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
2e220 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
2e230 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
2e240 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2e250 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
2e260 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
2e270 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
2e280 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20  a = 0;.  }else{ 
2e290 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e  .    if( NEVER(n
2e2a0 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c  Key>0x7fffffff |
2e2b0 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20  | pKey==0) ){.  
2e2c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e2d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2e2e0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
2e2f0 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  ad += (int)nKey;
2e300 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
2e310 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e  ;.    nSrc = (in
2e320 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  t)nKey;.  }.  *p
2e330 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
2e340 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
2e350 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
2e360 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
2e370 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
2e380 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
2e390 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
2e3a0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
2e3b0 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
2e3c0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
2e3d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e3e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e3f0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
2e400 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
2e410 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
2e420 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2e430 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
2e440 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2e450 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
2e460 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
2e470 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
2e480 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
2e490 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
2e4a0 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
2e4b0 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
2e4c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2e4d0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
2e4e0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
2e4f0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
2e500 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2e510 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
2e520 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
2e530 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
2e540 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2e550 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
2e560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
2e570 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
2e580 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
2e590 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
2e5a0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
2e5b0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
2e5c0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
2e5d0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
2e5e0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
2e5f0 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
2e600 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
2e610 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
2e620 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
2e630 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
2e640 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
2e650 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
2e660 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
2e670 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
2e680 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
2e690 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
2e6a0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
2e6b0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
2e6c0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
2e6d0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
2e6e0 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
2e6f0 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
2e700 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
2e710 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61  ialized values a
2e720 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
2e730 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
2e740 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
2e750 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
2e760 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
2e770 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
2e780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e790 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
2e7a0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
2e7b0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
2e7c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
2e7d0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
2e7e0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
2e7f0 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
2e800 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
2e810 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2e820 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2e830 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
2e840 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
2e850 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
2e860 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2e870 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2e880 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2e890 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
2e8a0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
2e8b0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
2e8c0 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
2e8d0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
2e8e0 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
2e8f0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
2e900 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
2e910 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
2e920 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
2e930 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
2e940 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
2e950 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e960 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
2e970 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2e980 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
2e990 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2e9a0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
2e9b0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
2e9c0 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
2e9d0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
2e9e0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
2e9f0 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
2ea00 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
2ea10 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
2ea20 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2ea30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2ea40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ea50 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2ea60 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2ea70 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
2ea80 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
2ea90 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2eaa0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2eab0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
2eac0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
2ead0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
2eae0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
2eaf0 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
2eb00 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
2eb10 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
2eb20 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
2eb30 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
2eb40 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
2eb50 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
2eb60 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
2eb70 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
2eb80 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
2eb90 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2eba0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2ebb0 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
2ebc0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
2ebd0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
2ebe0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2ebf0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2ec00 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2ec10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2ec20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
2ec30 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ec40 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
2ec50 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
2ec60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
2ec70 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
2ec80 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
2ec90 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
2eca0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
2ecb0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
2ecc0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
2ecd0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
2ece0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
2ecf0 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
2ed00 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
2ed10 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
2ed20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
2ed30 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ed40 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2ed50 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
2ed60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
2ed70 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
2ed80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
2ed90 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
2eda0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
2edb0 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
2edc0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
2edd0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
2ede0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
2edf0 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
2ee00 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
2ee10 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
2ee20 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
2ee30 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
2ee40 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b    if( nSrc==0 ){
2ee50 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  .      nSrc = nD
2ee60 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20  ata;.      pSrc 
2ee70 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
2ee80 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
2ee90 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2eea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2eeb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
2eec0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
2eed0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
2eee0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
2eef0 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
2ef00 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
2ef10 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
2ef20 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
2ef30 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
2ef40 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
2ef50 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
2ef60 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
2ef70 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
2ef80 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
2ef90 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
2efa0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
2efb0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
2efc0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
2efd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2efe0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
2eff0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
2f000 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
2f010 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
2f020 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
2f030 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20  ){.  u32 pc;    
2f040 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2f050 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
2f060 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
2f070 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
2f080 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
2f090 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
2f0a0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
2f0b0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
2f0c0 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
2f0d0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2f0e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
2f0f0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2f100 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
2f110 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
2f120 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
2f130 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
2f140 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
2f150 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2f160 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2f170 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
2f180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2f190 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2f1a0 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
2f1b0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2f1c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2f1d0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2f1e0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
2f1f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f200 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2f210 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2f220 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2f230 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50  ata;.  ptr = &pP
2f240 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  age->aCellIdx[2*
2f250 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
2f260 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64  2byte(ptr);.  hd
2f270 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2f280 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65  fset;.  testcase
2f290 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26  ( pc==get2byte(&
2f2a0 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
2f2b0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
2f2c0 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z==pPage->pBt->u
2f2d0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
2f2e0 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74  f( pc < (u32)get
2f2f0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2f300 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70  5]) || pc+sz > p
2f310 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2f320 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52  eSize ){.    *pR
2f330 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
2f340 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
2f350 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
2f360 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
2f370 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
2f380 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  rc ){.    *pRC =
2f390 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2f3a0 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
2f3b0 65 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65  ell--;.  memmove
2f3c0 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28  (ptr, ptr+2, 2*(
2f3d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69  pPage->nCell - i
2f3e0 64 78 29 29 3b 0a 20 20 70 75 74 32 62 79 74 65  dx));.  put2byte
2f3f0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
2f400 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
2f410 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
2f420 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  2;.}../*.** Inse
2f430 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
2f440 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
2f450 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
2f460 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
2f470 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
2f480 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
2f490 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2f4a0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2f4b0 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
2f4c0 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
2f4d0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
2f4e0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
2f4f0 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
2f500 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
2f510 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
2f520 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
2f530 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
2f540 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
2f550 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
2f560 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
2f570 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
2f580 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2f590 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
2f5a0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
2f5b0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
2f5c0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
2f5d0 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
2f5e0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
2f5f0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
2f600 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
2f610 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
2f620 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
2f630 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
2f640 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
2f650 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
2f660 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
2f670 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
2f680 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
2f690 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
2f6a0 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
2f6b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2f6c0 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
2f6d0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
2f6e0 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
2f6f0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
2f700 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
2f710 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
2f720 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
2f730 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
2f740 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
2f750 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
2f760 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
2f770 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
2f780 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
2f790 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
2f7a0 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
2f7b0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
2f7c0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
2f7d0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
2f7e0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
2f7f0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
2f800 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
2f810 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
2f820 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
2f830 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
2f840 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
2f850 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
2f860 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
2f870 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
2f880 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
2f890 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
2f8a0 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
2f8b0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
2f8c0 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
2f8d0 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
2f8e0 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
2f8f0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
2f900 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
2f910 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
2f920 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
2f930 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
2f940 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
2f950 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
2f960 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2f970 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  nter */.  int en
2f980 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
2f990 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
2f9a0 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
2f9b0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2f9c0 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
2f9d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2f9e0 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
2f9f0 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
2fa00 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
2fa10 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
2fa20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2fa30 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
2fa40 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2fa50 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2fa60 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
2fa70 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
2fa80 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
2fa90 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f  Skip = (iChild ?
2faa0 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20   4 : 0);..  if( 
2fab0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
2fac0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
2fad0 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
2fae0 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
2faf0 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
2fb00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
2fb10 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2fb20 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ) && MX_CELL(pPa
2fb30 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
2fb40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2fb50 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
2fb60 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2fb70 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
2fb80 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
2fb90 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
2fba0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2fbb0 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
2fbc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2fbd0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2fbe0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2fbf0 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
2fc00 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
2fc10 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
2fc20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
2fc30 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
2fc40 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
2fc50 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
2fc60 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
2fc70 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
2fc80 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
2fc90 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
2fca0 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
2fcb0 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
2fcc0 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
2fcd0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
2fce0 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
2fcf0 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
2fd00 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
2fd10 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
2fd20 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
2fd30 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
2fd40 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
2fd50 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
2fd60 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
2fd70 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
2fd80 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
2fd90 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
2fda0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
2fdb0 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
2fdc0 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
2fdd0 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
2fde0 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
2fdf0 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2fe00 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
2fe10 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2fe20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
2fe30 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2fe40 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
2fe50 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2fe60 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
2fe70 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
2fe80 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
2fe90 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
2fea0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
2feb0 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  apOvfl[0])) );. 
2fec0 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
2fed0 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
2fee0 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
2fef0 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  ] = (u16)i;.  }e
2ff00 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2ff10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ff20 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2ff30 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2ff40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ff50 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2ff60 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2ff70 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
2ff80 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2ff90 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2ffa0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
2ffb0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2ffc0 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
2ffd0 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
2ffe0 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
2fff0 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
30000 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
30010 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
30020 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
30030 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
30040 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
30050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
30060 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
30070 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
30080 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
30090 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
300a0 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
300b0 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
300c0 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
300d0 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
300e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
300f0 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
30100 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
30110 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
30120 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
30130 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
30140 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
30150 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
30160 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
30170 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
30180 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
30190 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
301a0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
301b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
301c0 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
301d0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  d);.    }.    me
301e0 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b  mmove(&data[ins+
301f0 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20  2], &data[ins], 
30200 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75  end-ins);.    pu
30210 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
30220 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
30230 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
30240 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
30250 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
30260 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30270 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
30280 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
30290 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
302a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
302b0 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
302c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
302d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
302e0 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
302f0 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
30300 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
30310 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
30320 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
30330 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
30340 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
30350 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
30360 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
30370 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
30380 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
30390 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
303a0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
303b0 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
303c0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
303d0 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
303e0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
303f0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
30400 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
30410 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
30420 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
30430 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
30440 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
30450 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
30460 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
30470 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
30480 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
30490 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
304a0 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
304b0 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
304c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
304d0 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
304e0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
304f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
30500 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
30510 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
30520 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
30530 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
30540 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
30550 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
30560 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
30570 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
30580 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
30590 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
305a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
305b0 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
305c0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
305d0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
305e0 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
305f0 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
30600 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
30610 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
30620 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
30630 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
30640 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
30650 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
30660 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
30670 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
30680 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30690 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
306a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
306b0 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
306c0 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58  & nCell<=(int)MX
306d0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
306e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
306f0 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50   (int)MX_CELL(pP
30700 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
30710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30720 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30730 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
30740 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
30750 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
30760 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
30770 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
30780 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
30790 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
307a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
307b0 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
307c0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55  data[hdr+5])==nU
307d0 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c  sable );..  pCel
307e0 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61  lptr = &pPage->a
307f0 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d  CellIdx[nCell*2]
30800 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e  ;.  cellbody = n
30810 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d  Usable;.  for(i=
30820 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  nCell-1; i>=0; i
30830 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20  --){.    u16 sz 
30840 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
30850 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
30860 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73     cellbody -= s
30870 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  z;.    put2byte(
30880 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
30890 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
308a0 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
308b0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b   apCell[i], sz);
308c0 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
308d0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
308e0 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
308f0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
30900 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
30910 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
30920 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
30930 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
30940 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
30950 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
30960 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
30970 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
30980 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
30990 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
309a0 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
309b0 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
309c0 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
309d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
309e0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
309f0 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
30a00 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
30a10 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
30a20 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
30a30 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
30a40 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
30a50 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
30a60 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
30a70 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
30a80 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
30a90 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
30aa0 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
30ab0 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
30ac0 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
30ad0 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
30ae0 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
30af0 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
30b00 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
30b10 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
30b20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
30b30 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
30b40 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
30b50 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
30b60 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
30b70 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
30b80 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
30b90 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
30ba0 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
30bb0 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
30bc0 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
30bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30be0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
30bf0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
30c00 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
30c10 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
30c20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
30c30 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
30c40 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
30c50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30c60 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
30c70 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
30c80 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
30c90 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
30ca0 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
30cb0 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
30cc0 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
30cd0 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
30ce0 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
30cf0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
30d00 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
30d10 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
30d20 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
30d30 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
30d40 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
30d50 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
30d60 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
30d70 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
30d80 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
30d90 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
30da0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
30db0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
30dc0 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
30dd0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
30de0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
30df0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
30e00 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
30e10 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
30e20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
30e30 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
30e40 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
30e50 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
30e60 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
30e70 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
30e80 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
30e90 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
30ea0 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
30eb0 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
30ec0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
30ed0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
30ee0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
30ef0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
30f00 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
30f10 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
30f20 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
30f30 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
30f40 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
30f50 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
30f60 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
30f70 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
30f80 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
30f90 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
30fa0 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
30fb0 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
30fc0 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
30fd0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
30fe0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
30ff0 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
31000 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
31010 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
31020 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
31030 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
31040 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
31050 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
31060 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
31070 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
31080 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
31090 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
310a0 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
310b0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
310c0 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
310d0 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
310e0 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
310f0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
31100 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
31110 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
31120 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
31130 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
31140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31150 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
31160 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
31170 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
31180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
311a0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
311b0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
311e0 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
311f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
31200 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
31210 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
31220 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31230 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
31240 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
31250 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
31260 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
31270 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ow==1 );..  /* T
31280 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  his error condit
31290 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ion is now caugh
312a0 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
312b0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
312c0 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  n */.  if( pPage
312d0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  ->nCell==0 ) ret
312e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
312f0 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
31300 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
31310 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
31320 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
31330 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
31340 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
31350 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31360 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
31370 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
31380 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
31390 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
313a0 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
313b0 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
313c0 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
313d0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
313e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
313f0 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
31400 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
31410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31420 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
31430 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
31440 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
31450 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  Page->apOvfl[0];
31460 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
31470 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
31480 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
31490 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
314a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
314b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
314c0 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
314d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
314e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
314f0 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
31500 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
31510 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
31520 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
31530 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
31540 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
31550 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
31560 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
31570 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
31580 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
31590 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
315a0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
315b0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
315c0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
315d0 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
315e0 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
315f0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
31600 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
31610 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
31620 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
31630 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
31640 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
31650 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
31660 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
31670 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
31680 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
31690 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
316a0 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
316b0 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
316c0 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
316d0 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
316e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
316f0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
31700 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
31710 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
31720 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
31730 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
31740 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
31750 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
31760 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
31770 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
31780 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
31790 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
317a0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
317b0 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
317c0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
317d0 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
317e0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
317f0 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
31800 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
31810 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
31820 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20  , pCell, &rc);. 
31830 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
31840 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
31850 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
31860 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
31870 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
31880 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
31890 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
318a0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
318b0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
318c0 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
318d0 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
318e0 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
318f0 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
31900 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
31910 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
31920 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
31930 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
31940 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
31950 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
31960 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
31970 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
31980 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
31990 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
319a0 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
319b0 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
319c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
319d0 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
319e0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
319f0 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
31a00 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
31a10 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
31a20 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
31a30 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
31a40 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
31a50 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
31a60 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
31a70 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
31a80 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
31a90 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
31aa0 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
31ab0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
31ac0 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
31ad0 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
31ae0 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
31af0 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
31b00 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
31b10 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
31b20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
31b30 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
31b40 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
31b50 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
31b60 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
31b70 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
31b80 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
31b90 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
31ba0 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
31bb0 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
31bc0 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
31bd0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
31be0 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
31bf0 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
31c00 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
31c10 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
31c20 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
31c30 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  t, pParent->nCel
31c40 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29  l, pSpace, (int)
31c50 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20  (pOut-pSpace),. 
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
31c70 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72   pPage->pgno, &r
31c80 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  c);..    /* Set 
31c90 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
31ca0 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65  pointer of pPare
31cb0 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nt to point to t
31cc0 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
31cd0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
31ce0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
31cf0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
31d00 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20  8], pgnoNew);.  
31d10 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
31d20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
31d30 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
31d40 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
31d50 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
31d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
31d70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
31d80 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
31d90 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  */..#if 0./*.** 
31da0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
31db0 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
31dc0 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  e anything to th
31dd0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53  e operation of S
31de0 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20  QLite..** it is 
31df0 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61  sometimes activa
31e00 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  ted temporarily 
31e10 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20  while debugging 
31e20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65  code responsible
31e30 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67   .** for setting
31e40 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31e50 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
31e60 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50  int ptrmapCheckP
31e70 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61  ages(MemPage **a
31e80 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65  pPage, int nPage
31e90 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
31ea0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67   for(i=0; i<nPag
31eb0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e  e; i++){.    Pgn
31ec0 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20  o n;.    u8 e;. 
31ed0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
31ee0 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20  e = apPage[i];. 
31ef0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
31f00 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
31f10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
31f20 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20  ->isInit );..   
31f30 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67   for(j=0; j<pPag
31f40 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a  e->nCell; j++){.
31f50 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
31f60 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a  nfo;.      u8 *z
31f70 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20  ;.     .      z 
31f80 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
31f90 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65  , j);.      btre
31fa0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
31fb0 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a  age, z, &info);.
31fc0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
31fd0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
31fe0 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
31ff0 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f  get4byte(&z[info
32000 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
32010 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
32020 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26  pBt, ovfl, &e, &
32030 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
32040 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
32050 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
32060 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20  OVERFLOW1 );.   
32070 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
32080 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
32090 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c         Pgno chil
320a0 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b  d = get4byte(z);
320b0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
320c0 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
320d0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
320e0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
320f0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
32100 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
32110 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
32120 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
32130 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
32140 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
32150 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
32160 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
32170 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47  );.      ptrmapG
32180 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
32190 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73  e, &n);.      as
321a0 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
321b0 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
321c0 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d  P_BTREE );.    }
321d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
321e0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
321f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
32200 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
32210 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
32220 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
32230 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
32240 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
32250 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
32260 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
32270 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
32280 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
32290 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
322a0 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
322b0 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
322c0 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
322d0 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
322e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
322f0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
32300 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
32310 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
32320 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
32330 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
32340 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
32350 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
32360 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
32370 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
32380 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
32390 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
323a0 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
323b0 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
323c0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
323d0 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
323e0 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70  he.** MemPage.ap
323f0 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74  Ovfl[] array), t
32400 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69  hey are not copi
32410 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a  ed to pTo. .**.*
32420 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
32430 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20  ng, page pTo is 
32440 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73  reinitialized us
32450 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67  ing btreeInitPag
32460 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  e()..**.** The p
32470 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68  erformance of th
32480 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
32490 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20  ot critical. It 
324a0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
324b0 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f  .** the balance_
324c0 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20  shallower() and 
324d0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
324e0 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69   procedures, nei
324f0 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68  ther of.** which
32500 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65   are called ofte
32510 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63  n under normal c
32520 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f  ircumstances..*/
32530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70  .static void cop
32540 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
32550 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
32560 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a  Page *pTo, int *
32570 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
32580 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
32590 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20  .    BtShared * 
325a0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
325b0 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a  m->pBt;.    u8 *
325c0 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70   const aFrom = p
325d0 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20  From->aData;.   
325e0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
325f0 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
32600 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f    int const iFro
32610 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64  mHdr = pFrom->hd
32620 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74  rOffset;.    int
32630 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20   const iToHdr = 
32640 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20  ((pTo->pgno==1) 
32650 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20  ? 100 : 0);.    
32660 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
32670 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20  iData;.  .  .   
32680 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
32690 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73  isInit );.    as
326a0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
326b0 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
326c0 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
326d0 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
326e0 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70  dr+5]) <= (int)p
326f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
32700 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
32710 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
32720 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61   content from pa
32730 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
32740 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61   pTo. */.    iDa
32750 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ta = get2byte(&a
32760 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
32770 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
32780 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f  To[iData], &aFro
32790 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75  m[iData], pBt->u
327a0 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29  sableSize-iData)
327b0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
327c0 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f  o[iToHdr], &aFro
327d0 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72  m[iFromHdr], pFr
327e0 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  om->cellOffset +
327f0 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29   2*pFrom->nCell)
32800 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e  ;.  .    /* Rein
32810 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54  itialize page pT
32820 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  o so that the co
32830 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65  ntents of the Me
32840 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a  mPage structure.
32850 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65      ** match the
32860 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69   new data. The i
32870 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
32880 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c   pTo can actuall
32890 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20  y fail under.   
328a0 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75   ** fairly obscu
328b0 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
328c0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
328d0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e   is a copy of in
328e0 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
328f0 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20  * page pFrom..  
32900 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73    */.    pTo->is
32910 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63  Init = 0;.    rc
32920 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
32930 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  (pTo);.    if( r
32940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32950 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
32960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
32970 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
32980 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
32990 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
329a0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
329b0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
329c0 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79  s.    ** for any
329d0 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66   b-tree or overf
329e0 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70  low pages that p
329f0 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  To now contains 
32a00 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e  the pointers to.
32a10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32a20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
32a30 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74        *pRC = set
32a40 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f  ChildPtrmaps(pTo
32a50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
32a60 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
32a70 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
32a80 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50   cells on the iP
32a90 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c  arentIdx'th chil
32aa0 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20  d of pParent.** 
32ab0 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20  (hereafter "the 
32ac0 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f  page") and up to
32ad0 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74   2 siblings so t
32ae0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
32af0 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20  ve about the.** 
32b00 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
32b10 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c  ree space. Usual
32b20 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c  ly a single sibl
32b30 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ing on either si
32b40 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  de of the.** pag
32b50 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  e are used in th
32b60 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f  e balancing, tho
32b70 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67  ugh both sibling
32b80 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
32b90 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66  m one.** side if
32ba0 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65   the page is the
32bb0 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63   first or last c
32bc0 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
32bd0 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  nt. If the page 
32be0 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68  .** has fewer th
32bf0 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73  an 2 siblings (s
32c00 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
32c10 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
32c20 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  f the page.** is
32c30 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20   a root page or 
32c40 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f  a child of a roo
32c50 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c  t page) then all
32c60 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
32c70 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61  ngs.** participa
32c80 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
32c90 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
32ca0 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
32cb0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69  s of the page mi
32cc0 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
32cd0 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
32ce0 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20   .** one or two 
32cf0 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
32d00 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
32d10 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
32d20 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a  ver full. .**.**
32d30 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
32d40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32d50 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
32d60 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  the cells on the
32d70 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e   page.** might n
32d80 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
32d90 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65  tored in MemPage
32da0 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63  .aData[]. This c
32db0 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
32dc0 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
32dd0 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69  full. This routi
32de0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
32df0 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61  all cells alloca
32e00 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ted.** to the pa
32e10 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
32e20 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d  ngs fit into Mem
32e30 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66  Page.aData[] bef
32e40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
32e50 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
32e60 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
32e70 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
32e80 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73   siblings, cells
32e90 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72   may be.** inser
32ea0 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f  ted into or remo
32eb0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ved from the par
32ec0 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e  ent page (pParen
32ed0 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20  t). Doing so.** 
32ee0 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61  may cause the pa
32ef0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63  rent page to bec
32f00 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
32f10 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68  underfull. If th
32f20 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69  is.** happens, i
32f30 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
32f40 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
32f50 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20  aller to invoke 
32f60 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62  the correct.** b
32f70 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
32f80 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f   to fix this pro
32f90 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61  blem (see the ba
32fa0 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29  lance() routine)
32fb0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  . .**.** If this
32fc0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
32fd0 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
32fe0 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
32ff0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
33000 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
33010 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72  te. So if this r
33020 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
33030 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
33040 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
33050 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ack..**.** The t
33060 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
33070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
33080 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61  aOvflSpace, is a
33090 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a   pointer to a.**
330a0 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75   buffer big enou
330b0 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70  gh to hold one p
330c0 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e  age. If while in
330d0 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e  serting cells in
330e0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a  to the parent.**
330f0 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20   page (pParent) 
33100 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
33110 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
33120 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73  , this buffer is
33130 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
33140 65 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f  e the parent's o
33150 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42  verflow cells. B
33160 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
33170 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20  tion inserts.** 
33180 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75  a maximum of fou
33190 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  r divider cells 
331a0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
331b0 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61  page, and the ma
331c0 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66  ximum.** size of
331d0 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77   a cell stored w
331e0 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61  ithin an interna
331f0 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  l node is always
33200 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a   less than 1/4.*
33210 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  * of the page-si
33220 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61  ze, the aOvflSpa
33230 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67  ce[] buffer is g
33240 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
33250 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20  large.** enough 
33260 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  for all overflow
33270 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   cells..**.** If
33280 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73   aOvflSpace is s
33290 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69  et to a null poi
332a0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
332b0 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
332c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
332d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
332e0 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
332f0 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65  ER >= 1700 && de
33300 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70  fined(_M_ARM).#p
33310 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22  ragma optimize("
33320 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73  ", off).#endif.s
33330 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
33340 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d  e_nonroot(.  Mem
33350 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
33360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33370 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73  Parent page of s
33380 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61  iblings being ba
33390 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
333a0 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20  iParentIdx,     
333b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
333c0 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67  ndex of "the pag
333d0 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  e" in pParent */
333e0 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63  .  u8 *aOvflSpac
333f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
33400 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20     /* page-size 
33410 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
33420 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a  or parent ovfl *
33430 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20  /.  int isRoot, 
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33450 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
33460 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74  Parent is a root
33470 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62  -page */.  int b
33480 42 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20  Bulk            
33490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
334a0 75 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ue if this call 
334b0 69 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c  is part of a bul
334c0 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42  k load */.){.  B
334d0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
334e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
334f0 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
33500 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
33510 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33520 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33530 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
33540 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
33550 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
33560 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
33570 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
33580 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
33590 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
335a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
335b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
335c0 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
335d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
335e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33600 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
33610 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
33620 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
33630 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
33640 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
33650 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
33660 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
33670 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
33680 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
33690 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
336a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
336b0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
336c0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
336d0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
336e0 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
336f0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
33700 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
33710 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
33720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
33730 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
33740 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
33750 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
33760 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
33770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
33780 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
33790 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
337a0 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
337b0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
337c0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
337d0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
337e0 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
337f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33800 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
33810 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
33820 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
33830 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
33840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
33850 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
33860 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
33870 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
33880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
33890 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
338a0 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
338b0 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
338c0 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
338d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
338e0 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
338f0 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
33900 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
33910 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
33920 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
33930 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
33940 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
33950 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
33960 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
33970 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
33980 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
33990 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
339a0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
339b0 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
339c0 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
339d0 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
339e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
339f0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
33a00 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
33a10 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
33a20 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
33a30 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
33a40 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
33a50 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
33a60 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
33a70 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
33a80 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
33a90 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
33aa0 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
33ab0 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
33ac0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
33ad0 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
33ae0 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
33af0 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
33b00 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
33b10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
33b20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
33b30 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
33b40 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33b60 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
33b70 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
33b80 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
33b90 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
33ba0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
33bb0 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
33bc0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
33bd0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
33be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33bf0 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
33c00 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
33c10 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
33c20 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
33c30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33c40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
33c50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
33c60 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
33c70 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33c80 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
33c90 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
33ca0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
33cb0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
33cc0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
33cd0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
33ce0 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
33cf0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
33d00 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
33d10 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
33d20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
33d30 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
33d40 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
33d50 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
33d60 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
33d70 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
33d80 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
33d90 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
33da0 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
33db0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
33dc0 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
33dd0 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
33de0 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20  BtreeDelete().. 
33df0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
33e00 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
33e10 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
33e20 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
33e30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
33e40 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
33e50 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76  || pParent->aiOv
33e60 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64  fl[0]==iParentId
33e70 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
33e80 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
33e90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33ea0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
33eb0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
33ec0 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
33ed0 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
33ee0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
33ef0 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
33f00 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
33f10 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
33f20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
33f30 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
33f40 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
33f50 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
33f60 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
33f70 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
33f80 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
33f90 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
33fa0 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
33fb0 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
33fc0 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
33fd0 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
33fe0 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
33ff0 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
34000 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
34010 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
34020 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
34030 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
34040 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
34050 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
34060 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
34070 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
34080 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
34090 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
340a0 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
340b0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
340c0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
340d0 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20  e, since if any 
340e0 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c  existed they wil
340f0 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65  l.  ** have alre
34100 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ady been removed
34110 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  ..  */.  i = pPa
34120 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
34130 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
34140 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
34150 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
34160 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
34170 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62  t( bBulk==0 || b
34180 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69  Bulk==1 );.    i
34190 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30  f( iParentIdx==0
341a0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
341b0 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76      .      nxDiv
341c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
341d0 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
341e0 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  i ){.      nxDiv
341f0 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20   = i-2+bBulk;.  
34200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
34210 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
34220 29 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  );.      nxDiv =
34230 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20   iParentIdx-1;. 
34240 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62     }.    i = 2-b
34250 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64  Bulk;.  }.  nOld
34260 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69   = i+1;.  if( (i
34270 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
34280 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72  nOverflow)==pPar
34290 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
342a0 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72    pRight = &pPar
342b0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
342c0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
342d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
342e0 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c  Right = findCell
342f0 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
34300 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
34310 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e  flow);.  }.  pgn
34320 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69  o = get4byte(pRi
34330 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  ght);.  while( 1
34340 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   ){.    rc = get
34350 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
34360 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d   pgno, &apOld[i]
34370 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
34380 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
34390 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29  (apOld, 0, (i+1)
343a0 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
343b0 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  ));.      goto b
343c0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
343d0 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65      }.    nMaxCe
343e0 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
343f0 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
34400 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
34410 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29    if( (i--)==0 )
34420 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28   break;..    if(
34430 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e   i+nxDiv==pParen
34440 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20  t->aiOvfl[0] && 
34450 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
34460 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ow ){.      apDi
34470 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e  v[i] = pParent->
34480 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20  apOvfl[0];.     
34490 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
344a0 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
344b0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
344c0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
344d0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
344e0 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65     pParent->nOve
344f0 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  rflow = 0;.    }
34500 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69  else{.      apDi
34510 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
34520 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
34530 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
34540 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  low);.      pgno
34550 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
34560 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
34570 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
34580 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
34590 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  iv[i]);..      /
345a0 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20  * Drop the cell 
345b0 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
345c0 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73  page. apDiv[i] s
345d0 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20  till points to. 
345e0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c       ** the cell
345f0 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65   within the pare
34600 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  nt, even though 
34610 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70  it has been drop
34620 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ped..      ** Th
34630 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
34640 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65  se dropping a ce
34650 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74  ll only overwrit
34660 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  es the first.   
34670 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
34680 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73   of it, and this
34690 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
346a0 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73  ot need the firs
346b0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
346c0 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76  bytes of the div
346d0 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68  ider cell. So th
346e0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66  e pointer is saf
346f0 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a  e to use.      *
34700 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20  * later on.  .  
34710 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
34720 42 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61 72  But not if we ar
34730 65 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65  e in secure-dele
34740 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75  te mode. In secu
34750 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a  re-delete mode,.
34760 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f        ** the dro
34770 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20  pCell() routine 
34780 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
34790 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77  he entire cell w
347a0 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20  ith zeroes..    
347b0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
347c0 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63  e, temporarily c
347d0 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74  opy the cell int
347e0 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  o the aOvflSpace
347f0 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  [].      ** buff
34800 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  er. It will be c
34810 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20  opied out again 
34820 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61  as soon as the a
34830 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20  Space[] buffer. 
34840 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63       ** is alloc
34850 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ated.  */.      
34860 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
34870 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
34880 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20  ELETE ){.       
34890 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20   int iOff;..    
348a0 20 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49 54      iOff = SQLIT
348b0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44  E_PTR_TO_INT(apD
348c0 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f  iv[i]) - SQLITE_
348d0 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65  PTR_TO_INT(pPare
348e0 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
348f0 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a      if( (iOff+sz
34900 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74  New[i])>(int)pBt
34910 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
34920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
34930 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34940 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  PT;.          me
34950 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
34960 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
34970 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20  age*));.        
34980 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
34990 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
349a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
349b0 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70   memcpy(&aOvflSp
349c0 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76  ace[iOff], apDiv
349d0 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a  [i], szNew[i]);.
349e0 20 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b            apDiv[
349f0 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  i] = &aOvflSpace
34a00 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e  [apDiv[i]-pParen
34a10 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20  t->aData];.     
34a20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34a30 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
34a40 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
34a50 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c  rent->nOverflow,
34a60 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b   szNew[i], &rc);
34a70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
34a80 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
34a90 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
34aa0 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
34ab0 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
34ac0 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
34ad0 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
34ae0 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
34af0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
34b00 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
34b10 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
34b20 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e    */.  k = pBt->
34b30 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44  pageSize + ROUND
34b40 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
34b50 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20  ));.  szScratch 
34b60 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
34b70 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
34b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b90 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
34ba0 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
34bb0 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
34bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bd0 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
34be0 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
34bf0 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
34c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c10 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
34c20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64  */.     + k*nOld
34c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c50 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
34c60 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f  pies (apCopy) */
34c70 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
34c80 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
34c90 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
34ca0 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
34cb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
34cc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
34cd0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
34ce0 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
34cf0 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
34d00 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
34d10 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73  Space1 = (u8*)&s
34d20 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
34d30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
34d40 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
34d50 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20  (aSpace1) );..  
34d60 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
34d70 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
34d80 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
34d90 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
34da0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
34db0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
34dc0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
34dd0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
34de0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
34df0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
34e00 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53  obtained from aS
34e10 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
34e20 76 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ve the divider c
34e30 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
34e40 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
34e50 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
34e60 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
34e70 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
34e80 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
34e90 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
34ea0 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
34eb0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
34ec0 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
34ed0 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
34ee0 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
34ef0 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
34f00 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
34f10 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
34f20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
34f30 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
34f40 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
34f50 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
34f60 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
34f70 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
34f80 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
34f90 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
34fa0 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
34fb0 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
34fc0 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
34fd0 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
34fe0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
34ff0 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
35000 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
35010 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
35020 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
35030 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
35040 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
35050 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43  ys..  */.  leafC
35060 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
35070 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
35080 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
35090 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
350a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
350b0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
350c0 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f  imit;.    .    /
350d0 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
350e0 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61  nything else, ta
350f0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
35100 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73   i'th original s
35110 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68  ibling.    ** Th
35120 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
35130 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
35140 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
35150 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20  opies rather.   
35160 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
35170 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
35180 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
35190 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
351a0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
351b0 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
351c0 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
351d0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
351e0 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
351f0 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b  mPage*)&aSpace1[
35200 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
35210 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  k*i];.    memcpy
35220 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c  (pOld, apOld[i],
35230 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
35240 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61  );.    pOld->aDa
35250 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c  ta = (void*)&pOl
35260 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d[1];.    memcpy
35270 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70  (pOld->aData, ap
35280 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
35290 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
352a0 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64      limit = pOld
352b0 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
352c0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
352d0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
352e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  >0 ){.      for(
352f0 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
35300 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
35310 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
35320 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61  lls );.        a
35330 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
35340 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
35350 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
35360 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
35370 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
35380 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
35390 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  ]);.        nCel
353a0 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
353b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
353c0 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e   *aData = pOld->
353d0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36  aData;.      u16
353e0 20 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64   maskPage = pOld
353f0 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20  ->maskPage;.    
35400 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
35410 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66   = pOld->cellOff
35420 73 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  set;.      for(j
35430 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
35440 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
35450 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
35460 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
35470 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
35480 6e 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20  ndCellv2(aData, 
35490 6d 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66  maskPage, cellOf
354a0 66 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20  fset, j);.      
354b0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
354c0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
354d0 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
354e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  ]);.        nCel
354f0 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
35500 20 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66   }       .    if
35510 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c  ( i<nOld-1 && !l
35520 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20  eafData){.      
35530 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a  u16 sz = (u16)sz
35540 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38  New[i];.      u8
35550 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61   *pTemp;.      a
35560 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
35570 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
35580 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
35590 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  sz;.      pTemp 
355a0 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
355b0 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63  e1];.      iSpac
355c0 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
355d0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
355e0 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
355f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
35600 70 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42  pace1 <= (int)pB
35610 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
35620 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
35630 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
35640 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
35650 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
35660 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
35670 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
35680 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c  Correction==0 ||
35690 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
356a0 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  =4 );.      szCe
356b0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65  ll[nCell] = szCe
356c0 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66  ll[nCell] - leaf
356d0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
356e0 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
356f0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  f ){.        ass
35700 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
35710 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
35720 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e    assert( pOld->
35730 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  hdrOffset==0 );.
35740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
35750 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
35760 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
35770 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
35780 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  left.        ** 
35790 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
357a0 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
357b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
357c0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
357d0 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  ld->aData[8], 4)
357e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
357f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
35800 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
35810 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
35820 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
35830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
35840 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
35850 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
35860 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
35870 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
35880 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
35890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
358a0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
358b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
358c0 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
358d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
358e0 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
358f0 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
35900 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
35910 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
35920 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
35930 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
35940 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
35950 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
35960 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
35970 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
35980 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
35990 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
359a0 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
359b0 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
359c0 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
359d0 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
359e0 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
359f0 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
35a00 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
35a10 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
35a20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
35a30 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
35a40 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
35a50 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
35a60 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
35a70 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
35a80 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
35a90 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
35aa0 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
35ab0 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
35ac0 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
35ad0 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
35ae0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
35af0 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
35b00 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
35b10 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
35b20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
35b30 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
35b40 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
35b50 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
35b60 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
35b70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
35b80 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
35b90 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
35ba0 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
35bb0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
35bc0 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
35bd0 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
35be0 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
35bf0 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
35c00 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
35c10 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
35c20 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
35c30 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
35c40 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
35c50 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
35c60 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
35c70 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
35c80 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
35c90 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20       if( k>NB+1 
35ca0 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  ){ rc = SQLITE_C
35cb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74  ORRUPT_BKPT; got
35cc0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
35cd0 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p; }.    }.  }. 
35ce0 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
35cf0 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
35d00 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
35d10 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
35d20 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
35d30 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
35d40 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
35d50 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
35d60 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
35d70 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
35d80 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
35d90 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
35da0 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
35db0 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
35dc0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
35dd0 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
35de0 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
35df0 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
35e00 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
35e10 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
35e20 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
35e30 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
35e40 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
35e50 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
35e60 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
35e70 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
35e80 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
35e90 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
35ea0 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
35eb0 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
35ec0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
35ed0 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
35ee0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
35ef0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
35f00 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
35f10 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
35f20 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
35f30 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
35f40 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
35f50 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
35f60 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
35f70 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
35f80 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
35f90 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
35fa0 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
35fb0 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
35fc0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
35fd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
35fe0 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
35ff0 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
36000 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
36010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36020 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
36030 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
36040 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
36050 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
36060 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
36070 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
36080 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
36090 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
360a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
360b0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
360c0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
360d0 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  ==0 .       || (
360e0 21 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68  !bBulk && szRigh
360f0 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73  t+szCell[d]+2<=s
36100 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d  zLeft-(szCell[r]
36110 2b 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  +2)) .    ){.   
36120 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
36130 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
36140 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
36150 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
36160 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
36170 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
36180 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
36190 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
361a0 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
361b0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
361c0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
361d0 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
361e0 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
361f0 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
36200 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
36210 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
36220 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
36230 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
36240 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
36250 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
36260 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
36270 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
36280 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
36290 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
362a0 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   page..  **.  **
362b0 20 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73   UPDATE:  The as
362c0 73 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20  sert() below is 
362d0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
362e0 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
362f0 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69  base.  ** file i
36300 73 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20  s corrupt.  The 
36310 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
36320 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20  be detected and 
36330 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20  reported later. 
36340 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63   ** in this proc
36350 65 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69  edure so there i
36360 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74  s no need to act
36370 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20   upon it now..  
36380 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
36390 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
363a0 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
363b0 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
363c0 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e  nCell==0) );.#en
363d0 64 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42  dif..  TRACE(("B
363e0 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
363f0 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
36400 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
36410 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
36420 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
36430 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
36440 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
36450 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
36460 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
36470 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
36480 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
36490 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
364a0 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
364b0 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
364c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
364d0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
364e0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
364f0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67  ;.  }.  pageFlag
36500 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44  s = apOld[0]->aD
36510 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
36520 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
36530 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
36540 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
36550 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
36560 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
36570 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
36580 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
36590 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
365a0 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
365b0 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
365c0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
365d0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
365e0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
365f0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
36600 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
36610 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
36620 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
36630 2c 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20  , &pgno, (bBulk 
36640 3f 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b  ? 1 : pgno), 0);
36650 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36660 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
36670 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
36680 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
36690 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20     nNew++;..    
366a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
366b0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
366c0 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
366d0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
366e0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
366f0 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  UM ){.        pt
36700 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
36710 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
36720 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
36730 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
36740 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36760 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
36770 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
36780 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
36790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
367a0 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
367b0 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
367c0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
367d0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
367e0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65  <nOld ){.    fre
367f0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20  ePage(apOld[i], 
36800 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
36810 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
36820 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
36830 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
36840 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
36850 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
36860 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
36870 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
36880 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
36890 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
368a0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
368b0 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
368c0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
368d0 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
368e0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
368f0 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
36900 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
36910 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
36920 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
36930 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
36940 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
36950 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
36960 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
36970 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
36980 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
36990 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
369a0 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
369b0 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
369c0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
369d0 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
369e0 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
369f0 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
36a00 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
36a10 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
36a20 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
36a30 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
36a40 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
36a50 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
36a60 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
36a70 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
36a80 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
36a90 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
36aa0 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65   int minV = apNe
36ab0 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
36ac0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
36ad0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
36ae0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
36af0 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  ( apNew[j]->pgno
36b00 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
36b10 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
36b20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
36b30 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  V = apNew[j]->pg
36b40 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
36b50 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
36b60 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
36b70 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20  e *pT;.      pT 
36b80 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
36b90 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
36ba0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
36bb0 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
36bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
36bd0 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
36be0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
36bf0 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
36c00 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
36c10 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
36c20 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
36c30 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
36c40 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
36c50 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
36c60 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
36c70 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
36c80 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
36c90 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
36ca0 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
36cb0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
36cc0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
36cd0 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
36ce0 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
36cf0 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
36d00 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
36d10 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
36d20 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36d30 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
36d40 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
36d50 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
36d60 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
36d70 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
36d80 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
36d90 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
36da0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
36db0 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
36dc0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
36dd0 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
36de0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
36df0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
36e00 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
36e10 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
36e20 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
36e30 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
36e40 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
36e50 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
36e60 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
36e70 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
36e80 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
36e90 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
36ea0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
36eb0 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
36ec0 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
36ed0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
36ee0 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
36ef0 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
36f00 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
36f10 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
36f20 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
36f30 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
36f40 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
36f50 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
36f60 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
36f70 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
36f80 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
36f90 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
36fa0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
36fb0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
36fc0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
36fd0 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43  <nNew-1 || j==nC
36fe0 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ell );.    if( j
36ff0 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
37000 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
37010 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
37020 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
37030 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
37040 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
37050 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
37060 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
37070 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
37080 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
37090 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  emp = &aOvflSpac
370a0 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20  e[iOvflSpace];. 
370b0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
370c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
370d0 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
370e0 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
370f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
37100 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
37110 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
37120 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
37130 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
37140 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
37150 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
37160 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
37170 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
37180 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
37190 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
371a0 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
371b0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
371c0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
371d0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
371e0 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
371f0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
37200 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
37210 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
37220 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37230 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
37240 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
37250 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
37260 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
37270 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
37280 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
37290 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
372a0 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69  sz = 4 + putVari
372b0 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e  nt(&pCell[4], in
372c0 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  fo.nKey);.      
372d0 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
372e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
372f0 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
37300 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
37310 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
37320 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
37330 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
37340 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
37350 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
37360 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
37370 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70  ode, and its rep
37380 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34  orted size was 4
37390 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
373a0 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61  s, then it may a
373b0 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c  ctually be small
373c0 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20  er than this .  
373d0 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74        ** (see bt
373e0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
373f0 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
37400 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
37410 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
37420 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
37430 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
37440 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
37450 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
37460 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
37470 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
37480 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
37490 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
374a0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
374b0 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
374c0 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
374d0 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
374e0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
374f0 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
37500 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
37510 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
37520 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
37530 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
37540 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
37550 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
37560 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
37570 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
37580 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
37590 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
375a0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
375b0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
375c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
375d0 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
375e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
375f0 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20       iOvflSpace 
37600 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
37610 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
37620 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
37630 20 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c     assert( iOvfl
37640 53 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70 42  Space <= (int)pB
37650 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
37660 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28       insertCell(
37670 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
37680 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
37690 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
376a0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
376b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
376c0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
376d0 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  up;.      assert
376e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
376f0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
37700 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
37710 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
37720 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
37730 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
37740 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  =nCell );.  asse
37750 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20  rt( nOld>0 );.  
37760 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
37770 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61  ;.  if( (pageFla
37780 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d  gs & PTF_LEAF)==
37790 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68  0 ){.    u8 *zCh
377a0 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f  ild = &apCopy[nO
377b0 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b  ld-1]->aData[8];
377c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
377d0 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
377e0 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29  a[8], zChild, 4)
377f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
37800 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  oot && pParent->
37810 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72  nCell==0 && pPar
37820 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d  ent->hdrOffset<=
37830 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
37840 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  ){.    /* The ro
37850 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
37860 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -tree now contai
37870 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65  ns no cells. The
37880 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20   only sibling.  
37890 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65    ** page is the
378a0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
378b0 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79  the parent. Copy
378c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
378d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c   the.    ** chil
378e0 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  d page into the 
378f0 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69  parent, decreasi
37900 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68  ng the overall h
37910 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20  eight of the.   
37920 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63   ** b-tree struc
37930 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69  ture by one. Thi
37940 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61  s is described a
37950 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73  s the "balance-s
37960 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a  hallower".    **
37970 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69   sub-algorithm i
37980 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61  n some documenta
37990 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tion..    **.   
379a0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
379b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
379c0 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c  tabase, the call
379d0 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74   to copyNodeCont
379e0 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65  ent() .    ** se
379f0 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  ts all pointer-m
37a00 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
37a10 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61  sponding to data
37a20 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73  base image pages
37a30 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69   .    ** for whi
37a40 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  ch the pointer i
37a50 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  s stored within 
37a60 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  the content bein
37a70 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a  g copied..    **
37a80 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
37a90 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20  nd assert below 
37aa0 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
37ab0 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20  e child page is 
37ac0 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20  defragmented.   
37ad0 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c   ** (it must be,
37ae0 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20   as it was just 
37af0 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73  reconstructed us
37b00 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ing assemblePage
37b10 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  ()). This.    **
37b20 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66   is important if
37b30 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37b40 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70   happens to be p
37b50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
37b60 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61  abase.    ** ima
37b70 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ge.  */.    asse
37b80 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20  rt( nNew==1 );. 
37b90 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77     assert( apNew
37ba0 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20  [0]->nFree == . 
37bb0 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65         (get2byte
37bc0 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74  (&apNew[0]->aDat
37bd0 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e  a[5])-apNew[0]->
37be0 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77  cellOffset-apNew
37bf0 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20  [0]->nCell*2) . 
37c00 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f     );.    copyNo
37c10 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b  deContent(apNew[
37c20 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63  0], pParent, &rc
37c30 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  );.    freePage(
37c40 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a  apNew[0], &rc);.
37c50 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55    }else if( ISAU
37c60 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
37c70 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74  /* Fix the point
37c80 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
37c90 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  or all the cells
37ca0 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74   that were shift
37cb0 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20  ed around. .    
37cc0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76  ** There are sev
37cd0 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74  eral different t
37ce0 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d  ypes of pointer-
37cf0 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74  map entries that
37d00 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20   need to.    ** 
37d10 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
37d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53   this routine. S
37d30 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76  ome of these hav
37d40 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61  e been set alrea
37d50 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d  dy, but.    ** m
37d60 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68  any have not. Th
37d70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
37d80 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a   summary:.    **
37d90 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65  .    **   1) The
37da0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
37db0 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62  ted with new sib
37dc0 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20  ling pages that 
37dd0 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  were not.    ** 
37de0 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
37df0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
37e00 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
37e10 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
37e20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e      **      been
37e30 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
37e40 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
37e50 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
37e60 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a  that were.    **
37e70 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74        moved to t
37e80 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74  he free-list - t
37e90 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f  he freePage() co
37ea0 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72  de has taken car
37eb0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66  e.    **      of
37ec0 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20   those..    **. 
37ed0 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70     **   2) The p
37ee0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
37ef0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
37f00 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  th the first ove
37f10 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20  rflow.    **    
37f20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76    page in any ov
37f30 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73  erflow chains us
37f40 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65  ed by new divide
37f50 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a  r cells. These .
37f60 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65      **      have
37f70 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65   also already be
37f80 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66  en taken care of
37f90 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
37fa0 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a  ll() code..    *
37fb0 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66  *.    **   3) If
37fc0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
37fd0 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
37fe0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
37ff0 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a  d pages of.    *
38000 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f  *      cells sto
38010 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69  red on the sibli
38020 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65  ng pages may nee
38030 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
38040 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
38050 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   4) If the sibli
38060 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
38070 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79   internal intkey
38080 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79   nodes, then any
38090 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65  .    **      ove
380a0 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64  rflow pages used
380b0 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20   by these cells 
380c0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
380d0 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20  pdated.    **   
380e0 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74     (internal int
380f0 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20  key nodes never 
38100 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
38110 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
38120 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  es)..    **.    
38130 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
38140 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
38150 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
38160 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
38170 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e  p.    **      en
38180 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
38190 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
381a0 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
381b0 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
381c0 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74       to be updat
381d0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
381e0 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20  * Cases 1 and 2 
381f0 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61  are dealt with a
38200 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f  bove by other co
38210 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20  de. The next.   
38220 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20   ** block deals 
38230 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64  with cases 3 and
38240 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61   4 and the one a
38250 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20  fter that, case 
38260 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  5. Since.    ** 
38270 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
38280 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61  r map entry is a
38290 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65   relatively expe
382a0 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
382b0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64   this.    ** cod
382c0 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e  e only sets poin
382d0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
382e0 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  for child or ove
382f0 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
38300 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74   have.    ** act
38310 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77  ually moved betw
38320 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20  een pages.  */. 
38330 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
38340 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20   = apNew[0];.   
38350 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
38360 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20   apCopy[0];.    
38370 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  int nOverflow = 
38380 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
38390 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c  .    int iNextOl
383a0 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  d = pOld->nCell 
383b0 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  + nOverflow;.   
383c0 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d   int iOverflow =
383d0 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f   (nOverflow ? pO
383e0 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a 20  ld->aiOvfl[0] : 
383f0 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20  -1);.    j = 0; 
38400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
38420 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62  urrent 'old' sib
38430 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20  ling page */.   
38440 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   k = 0;         
38450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38460 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20