/ Hex Artifact Content
Login

Artifact c300cb68948a03f0049addddd9e36f28551e78ae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4d10: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4d20: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4d50: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4d60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4d90: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4da0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4db0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4dc0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4dd0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4de0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  .../*.** Save th
4e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
4e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
4e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
4e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
4e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
4e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
4e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
4e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
4e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
4ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
4eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
4ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
4ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
4ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
4ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
4f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
4f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
4f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
4f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
4f50: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
4f60: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
4f70: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
4f80: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
4f90: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20  (pCur) );..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
4fb0: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
4fc0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65  r->nKey);.  asse
4fd0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4fe0: 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65  K );  /* KeySize
4ff0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
5000: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5010: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
5020: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
5030: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
5040: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
5050: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
5060: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
5070: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
5080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
5090: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
50a0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
50b0: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
50c0: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
50d0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
50e0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
50f0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
5100: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
5110: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
5120: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
5130: 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61    if( 0==pCur->a
5140: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5150: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   ){.    void *pK
5160: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5170: 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e  oc( (int)pCur->n
5180: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5190: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
51a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
51b0: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
51c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5200: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
5210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5220: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
5230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5240: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5260: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5270: 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ( !pCur->apPage[
5280: 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  0]->intKey || !p
5290: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
52a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
52b0: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
52c0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
52d0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
52f0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5300: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
5310: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
5320: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
5330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5340: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5350: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5360: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5370: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5380: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20  n.** the table  
5390: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
53a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
53b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
53c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
53d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
53e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
53f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5400: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5410: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5420: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5430: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5440: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5450: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5460: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5470: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
54b0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
54c0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
54d0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
54e0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
54f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
5500: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
5510: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
5520: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
5530: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
5540: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5560: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5570: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5580: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5590: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
55a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
55d0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
55f0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5600: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
5640: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5650: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
5660: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
5670: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
56a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
56b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
56c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
56d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
56e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
5710: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
5720: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
5730: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
5740: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
5750: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
5760: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
5770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
5780: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
5790: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
57a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
57b0: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
57c0: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
57d0: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
57e0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
57f0: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
5800: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
5810: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
5820: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
5830: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
5840: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
5850: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
5860: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
5880: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
5890: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
58a0: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
58b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
58d0: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
58e0: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
58f0: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
5900: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
5910: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
5920: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
5950: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
5960: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
5970: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
5980: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
5990: 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20   aSpace[200];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c   pIdxKey);.  }el
5b00: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b30: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b40: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b50: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b60: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5b80: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5b90: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5ba0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bb0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5bc0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bd0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5be0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5bf0: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c00: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c10: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c20: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c30: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c40: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c50: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c60: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c70: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5c80: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5c90: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5ca0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cb0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5cc0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cd0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5cf0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d00: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d10: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d20: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5d80: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5d90: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5da0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5db0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5dc0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5dd0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5de0: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5df0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e00: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e10: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e20: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e50: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e60: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e70: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5e80: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5e90: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ea0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5eb0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
5ec0: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
5ed0: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
5ee0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5ef0: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
5f00: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5f10: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
5f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5f30: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5f40: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5f50: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5f60: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5f70: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5f80: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5f90: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5fa0: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5fb0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5fc0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5fd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
5fe0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
5ff0: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6000: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
6010: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
6020: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6030: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6040: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
6050: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6060: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6070: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6080: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
6090: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
60a0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
60b0: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
60c0: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
60d0: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
60e0: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
60f0: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
6100: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
6110: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
6120: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
6130: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
6140: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
6150: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
6160: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
6170: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
6180: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
6190: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
61a0: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
61b0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
61c0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45  OR_VALID || NEVE
61d0: 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  R(pCur->skipNext
61e0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 48 61  !=0) ){.    *pHa
61f0: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  sMoved = 1;.  }e
6200: 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  lse{.    *pHasMo
6210: 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ved = 0;.  }.  r
6220: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6230: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6240: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6250: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6260: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6270: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6280: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6290: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
62a0: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
62b0: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
62c0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
62d0: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
62e0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
62f0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6300: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6310: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6320: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6330: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6340: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6350: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6360: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6370: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6380: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6390: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
63a0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
63b0: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
63c0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
63d0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
63e0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
63f0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6400: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6410: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6420: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6430: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6440: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6450: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6460: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6470: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6480: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6490: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
64a0: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
64b0: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
64c0: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
64d0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
64e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
64f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6510: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6520: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6530: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6540: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6550: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6560: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6570: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6580: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6590: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
65a0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
65b0: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
65c0: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
65d0: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
65e0: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
65f0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6600: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
6610: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6620: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
6630: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
6640: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6650: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
6660: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
6670: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6680: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
6690: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
66a0: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
66b0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
66c0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
66d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
66e0: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
66f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6700: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
6710: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
6720: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6730: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
6740: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6750: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
6760: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
6770: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
6780: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
6790: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
67a0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
67b0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
67c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
67d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
67e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
67f0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
6800: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
6810: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
6820: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
6830: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
6840: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
6850: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
6860: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
6870: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
6880: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
6890: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
68a0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
68b0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
68c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
68d0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
68e0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
68f0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
6900: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
6910: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
6920: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
6930: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
6940: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6950: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
6960: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
6970: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
6980: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
6990: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
69a0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
69b0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
69c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
69d0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
69e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
69f0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
6a00: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
6a10: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
6a20: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
6a30: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
6a40: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
6a50: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
6a60: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
6a70: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
6a80: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
6a90: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
6aa0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
6ab0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
6ac0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
6ad0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
6ae0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
6af0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
6b00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6b10: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
6b20: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
6b30: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
6b40: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
6b50: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
6b60: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
6b70: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6b80: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
6b90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
6ba0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
6bb0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
6bc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
6bd0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
6be0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
6bf0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
6c00: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
6c10: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
6c20: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
6c30: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
6c40: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
6c50: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
6c60: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
6c70: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
6c80: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
6c90: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
6ca0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
6cb0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6cc0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
6cd0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
6ce0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
6cf0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
6d00: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
6d10: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
6d20: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
6d30: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
6d40: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
6d50: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6d60: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
6d70: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
6d80: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
6d90: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
6da0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
6db0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
6dc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6dd0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6de0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
6df0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6e00: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6e10: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6e20: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6e30: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6e40: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6e50: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6e60: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
6e70: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
6e80: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
6e90: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
6ea0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
6eb0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
6ec0: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
6ed0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
6ee0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6ef0: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
6f00: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6f10: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
6f20: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
6f30: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
6f40: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
6f50: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
6f60: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
6f70: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
6f80: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
6f90: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
6fa0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
6fb0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
6fc0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6fd0: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
6fe0: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
6ff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7000: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7010: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7020: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
7030: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
7040: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
7050: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
7060: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
7070: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
7080: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
7090: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
70a0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
70b0: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
70c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
70d0: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
70e0: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
70f0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7100: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7110: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7120: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
7130: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
7140: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
7150: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
7160: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
7170: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
7180: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7190: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
71a0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
71b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
71c0: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
71d0: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
71e0: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
71f0: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7200: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7210: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7220: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7230: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7240: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7250: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7260: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7270: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7280: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7290: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
72a0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
72b0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
72c0: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
72d0: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
72e0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
72f0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7300: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7310: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7320: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7330: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7340: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7350: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7360: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7370: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7380: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7390: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
73a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
73b0: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
73c0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
73d0: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
73e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
73f0: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7400: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7410: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7420: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7430: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7440: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7450: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7460: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7470: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7480: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7490: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
74a0: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
74b0: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
74c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
74d0: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
74e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
74f0: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7500: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7510: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
7520: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
7530: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
7540: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
7550: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
7560: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7570: 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20  r(). Using some 
7580: 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20  compilers, this 
7590: 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a  will be faster..
75a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
75b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
75c0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
75d0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
75e0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
75f0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
7600: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
7610: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
7620: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
7630: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
7640: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
7650: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
7660: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
7670: 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20   u16 n;         
7680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7690: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
76a0: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
76b0: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
76c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
76d0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
76e0: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
76f0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
7700: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7710: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
7720: 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ex) );..  pInfo-
7730: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
7740: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7750: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
7760: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
7770: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
7780: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
7790: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
77a0: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
77b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
77c0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
77d0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
77e0: 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 29 3b 0a  assert( n==0 );.
77f0: 20 20 20 20 20 20 6e 20 3d 20 67 65 74 56 61 72        n = getVar
7800: 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61  int32(pCell, nPa
7810: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
7820: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
7830: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
7840: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
7850: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
7860: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
7870: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7880: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7890: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
78a0: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
78b0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
78c0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
78d0: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
78e0: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
78f0: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
7900: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
7910: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
7920: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73  eader = n;.  tes
7930: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
7940: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
7950: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
7960: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
7970: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
7980: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
7990: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
79a0: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
79b0: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
79c0: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
79d0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
79e0: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
79f0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
7a00: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
7a10: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
7a20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
7a30: 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d   (pInfo->nSize =
7a40: 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61   (u16)(n+nPayloa
7a50: 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  d))<4 ) pInfo->n
7a60: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
7a70: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7a80: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
7a90: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7aa0: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
7ab0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
7ac0: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
7ad0: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
7ae0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
7af0: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
7b00: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
7b10: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
7b20: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
7b30: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
7b40: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
7b50: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
7b60: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
7b70: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
7b80: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
7b90: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
7ba0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
7bb0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
7bc0: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
7bd0: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
7be0: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
7bf0: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
7c00: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
7c10: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
7c20: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
7c30: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
7c40: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
7c50: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
7c60: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
7c70: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
7c80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
7c90: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
7ca0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
7cb0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7cc0: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7cd0: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
7ce0: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
7cf0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7d00: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7d10: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
7d20: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
7d30: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
7d40: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
7d50: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
7d60: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
7d70: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
7d80: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
7d90: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
7da0: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
7db0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
7dc0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7dd0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7de0: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7df0: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
7e00: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72     testcase( sur
7e10: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
7e20: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70   );.    if( surp
7e30: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
7e40: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
7e50: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
7e60: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
7e70: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7e80: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
7e90: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7ea0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7eb0: 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d  w = (u16)(pInfo-
7ec0: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20  >nLocal + n);.  
7ed0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7ee0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7ef0: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
7f00: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
7f10: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
7f20: 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72  fo) \.  btreePar
7f30: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
7f40: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
7f50: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
7f60: 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76  pInfo)).static v
7f70: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7f80: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
7f90: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7fa0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7fb0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
7fc0: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
7fd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
7fe0: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
7ff0: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
8000: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8010: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8020: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8030: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
8040: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
8050: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
8060: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
8070: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
8080: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
8090: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
80a0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
80b0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
80c0: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
80d0: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
80e0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
80f0: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
8100: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
8110: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
8120: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
8130: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
8140: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
8150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
8160: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
8170: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8180: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
8190: 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61  ter = &pCell[pPa
81a0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
81b0: 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  ];.  u32 nSize;.
81c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
81d0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
81e0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
81f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
8200: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
8210: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
8220: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
8230: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
8240: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
8250: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
8260: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
8270: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
8280: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
8290: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
82a0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
82b0: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
82c0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
82d0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
82e0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
82f0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8300: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8310: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
8320: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
8330: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
8340: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
8350: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
8360: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
8370: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
8380: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
8390: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
83a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
83b0: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
83c0: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
83d0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
83e0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
83f0: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
8400: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
8410: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
8420: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
8430: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
8440: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
8450: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
8460: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8470: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
8480: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
8490: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
84a0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
84b0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
84c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
84d0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
84e0: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
84f0: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  ;.  }..  testcas
8500: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8510: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8520: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8530: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
8540: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
8550: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
8560: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   ){.    int minL
8570: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8580: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
8590: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
85a0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
85b0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
85c0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
85d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
85e0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
85f0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
8600: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8610: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
8620: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
8630: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
8640: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
8650: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
8660: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
8670: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
8680: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
8690: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
86a0: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
86b0: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
86c0: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
86d0: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
86e0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
86f0: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
8700: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
8710: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
8720: 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65  )nSize;.}..#ifde
8730: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8740: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
8750: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
8760: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
8770: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8780: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
8790: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
87a0: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
87b0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
87c0: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
87d0: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
87e0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
87f0: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
8800: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
8810: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
8820: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
8830: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
8840: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
8850: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
8860: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
8870: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
8880: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
8890: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
88a0: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
88b0: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
88c0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
88d0: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
88e0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
88f0: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
8900: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
8910: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
8920: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
8930: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65  ell!=0 );.  btre
8940: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8950: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
8960: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
8970: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
8980: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
8990: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
89a0: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
89b0: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
89c0: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
89d0: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
89e0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
89f0: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
8a00: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
8a10: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
8a20: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
8a30: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
8a40: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
8a50: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
8a60: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
8a70: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
8a80: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
8a90: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
8aa0: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
8ab0: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8ac0: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8ad0: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8ae0: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
8af0: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
8b00: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
8b10: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8b20: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
8b30: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
8b40: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8b50: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8b80: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8bb0: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8bc0: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8be0: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
8bf0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
8c00: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
8c10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8c20: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
8c30: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
8c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8c50: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
8c60: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
8c70: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
8c80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8c90: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8ca0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
8cb0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8ce0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8cf0: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
8d00: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
8d10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8d20: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
8d30: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
8d40: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8d50: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8d60: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8d70: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8d80: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8d90: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8da0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8db0: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8dc0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8dd0: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8de0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
8df0: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
8e00: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
8e10: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
8e20: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8e30: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8e40: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8e50: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8e60: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8e70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8e80: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8e90: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8ea0: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8eb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8ec0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8ed0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8ee0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8ef0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8f00: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
8f10: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
8f20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
8f30: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
8f40: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8f50: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8f60: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8f70: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8f80: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8f90: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8fa0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8fb0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8fc0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8fd0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8fe0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8ff0: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
9000: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9010: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
9020: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
9030: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
9040: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
9050: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
9060: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
9070: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
9080: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
9090: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
90a0: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
90b0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
90c0: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
90d0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
90e0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
90f0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
9100: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
9110: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
9120: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
9130: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
9140: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9150: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
9160: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
9170: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9180: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9190: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
91a0: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
91b0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
91c0: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
91d0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
91e0: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
91f0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9200: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
9210: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
9220: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
9230: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
9240: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
9250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9260: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9270: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9280: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9290: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
92a0: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
92b0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
92c0: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
92d0: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
92e0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
92f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9300: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
9310: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
9320: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
9330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9340: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9350: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
9360: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
9370: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
9380: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
93a0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
93b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
93c0: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
93d0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
93e0: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
93f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9400: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
9410: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
9420: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
9430: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
9440: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9450: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
9460: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
9470: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
9480: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
9490: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
94a0: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
94b0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
94c0: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
94d0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
94e0: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
94f0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9500: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
9510: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
9520: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
9530: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9540: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9550: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9560: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
9570: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
9580: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
9590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
95a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
95b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
95c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
95d0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
95e0: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
95f0: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9600: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
9610: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9620: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
9630: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
9640: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
9650: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
9660: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
9670: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
9680: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
9690: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
96a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
96b0: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
96c0: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
96d0: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
96e0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
96f0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9700: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
9710: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
9720: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
9730: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
9740: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
9750: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
9760: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
9770: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
9780: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
9790: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
97a0: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
97b0: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
97c0: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
97d0: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
97e0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
97f0: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
9800: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
9810: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
9820: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
9830: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
9840: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
9850: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
9860: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
9870: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9880: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
9890: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
98a0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
98b0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
98c0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
98d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
98e0: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
98f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9900: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
9910: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
9920: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
9930: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9950: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
9960: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
9970: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
9980: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
99b0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
99c0: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
99d0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
99e0: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
99f0: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
9a00: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
9a10: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
9a20: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
9a30: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
9a40: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
9a50: 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
9a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
9a70: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
9a80: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9a90: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9aa0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9ab0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9ac0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9ad0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9ae0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9af0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9b00: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
9b10: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
9b20: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
9b30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
9b40: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
9b50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
9b60: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9b70: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
9b80: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9b90: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
9ba0: 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a  Byte < usableSiz
9bb0: 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20  e-8 );..  nFrag 
9bc0: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
9bd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9be0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
9bf0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
9c00: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
9c10: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9c20: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
9c30: 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65  Cell;.  top = ge
9c40: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9c50: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
9c60: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
9c70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9c80: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
9c90: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
9ca0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9cb0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
9cc0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9cd0: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9ce0: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9cf0: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9d00: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9d10: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9d20: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9d30: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9d40: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9d50: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9d60: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9d70: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9d80: 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c  }else if( gap+2<
9d90: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =top ){.    /* S
9da0: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
9db0: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9dc0: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9dd0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9de0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
9df0: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
9e00: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
9e10: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
9e20: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
9e30: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
9e40: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
9e50: 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 69 74  o accommodate it
9e60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9e70: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
9e80: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
9e90: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
9ea0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
9eb0: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
9ec0: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9ed0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9ee0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
9ef0: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
9f00: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
9f10: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
9f20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9f30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9f40: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65      }.      size
9f50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9f60: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9f70: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
9f80: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
9f90: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
9fa0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
9fb0: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
9fc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
9fd0: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  3 );.        if(
9fe0: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
9ff0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
a000: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
a010: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
a020: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
a030: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
a040: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
a050: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
a060: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
a070: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
a080: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
a090: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
a0a0: 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20  7] = (u8)(nFrag 
a0b0: 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  + x);.        }e
a0c0: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
a0d0: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
a0e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a0f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a100: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
a110: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
a120: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
a130: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
a140: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
a150: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
a160: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
a170: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
a180: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
a190: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
a1a0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
a1b0: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  data[pc+2], x);.
a1c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a1d0: 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78    *pIdx = pc + x
a1e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
a1f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
a200: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
a210: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
a220: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
a230: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20  enough space in 
a240: 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73  the gap to satis
a250: 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f  fy.  ** the allo
a260: 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c  cation.  If not,
a270: 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a   defragment..  *
a280: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
a290: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
a2a0: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
a2b0: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72  yte>top ){.    r
a2c0: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
a2d0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
a2e0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a2f0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
a300: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
a310: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
a320: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
a330: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
a340: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
a350: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
a360: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
a370: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
a380: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
a390: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a3a0: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
a3b0: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
a3c0: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
a3d0: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
a3e0: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
a3f0: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
a400: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
a410: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
a420: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
a430: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
a440: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
a450: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
a460: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
a470: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
a480: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
a490: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
a4a0: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
a4b0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a4c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
a4d0: 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70  +nByte <= (int)p
a4e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a4f0: 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78  eSize );.  *pIdx
a500: 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e   = top;.  return
a510: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
a520: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65  *.** Return a se
a530: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61  ction of the pPa
a540: 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65  ge->aData to the
a550: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68   freelist..** Th
a560: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
a570: 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f  the new free blo
a580: 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69  ck is pPage->aDi
a590: 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  sk[start].** and
a5a0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a5b0: 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22   block is "size"
a5c0: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f   bytes..**.** Mo
a5d0: 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74  st of the effort
a5e0: 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65   here is involve
a5f0: 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61  d in coalesing a
a600: 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20  djacent.** free 
a610: 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69  blocks into a si
a620: 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c  ngle big free bl
a630: 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
a640: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
a650: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
a660: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
a670: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
a680: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e  begin, hdr;.  in
a690: 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20  t iLast;        
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69  /* Largest possi
a6c0: 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66  ble freeblock of
a6d0: 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  fset */.  unsign
a6e0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
a6f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20  pPage->aData;.. 
a700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a710: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
a720: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
a730: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
a740: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
a750: 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d   assert( start>=
a760: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a770: 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  +6+pPage->childP
a780: 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  trSize );.  asse
a790: 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a  rt( (start + siz
a7a0: 65 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  e) <= (int)pPage
a7b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
a7c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
a7d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a7e0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
a7f0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
a800: 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f  ( size>=0 );   /
a810: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
a820: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69  ize is 4 */..  i
a830: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
a840: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
a850: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
a860: 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
a870: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
a880: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
a890: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
a8a0: 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74  elete.    ** opt
a8b0: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
a8c0: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  /.    memset(&da
a8d0: 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69  ta[start], 0, si
a8e0: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ze);.  }..  /* A
a8f0: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
a900: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
a910: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
a920: 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ocks.  Note that
a930: 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
a940: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
a950: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
a960: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
a970: 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49  e(),.  ** btreeI
a980: 6e 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f  nitPage() did no
a990: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
a9a0: 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20  ping cells or.  
a9b0: 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  ** freeblocks th
a9c0: 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65  at overlapped ce
a9d0: 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20  lls.   Nor does 
a9e0: 69 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74  it detect when t
a9f0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e  he.  ** cell con
aa00: 74 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64  tent area exceed
aa10: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  s the value in t
aa20: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20  he page header. 
aa30: 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73   If these.  ** s
aa40: 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c  ituations arise,
aa50: 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
aa60: 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f   insert operatio
aa70: 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74  ns might corrupt
aa80: 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  .  ** the freeli
aa90: 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65  st.  So we do ne
aaa0: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20  ed to check for 
aab0: 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65  corruption while
aac0: 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74   scanning.  ** t
aad0: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
aae0: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
aaf0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
ab00: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
ab10: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
ab20: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
ab30: 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   4;.  assert( st
ab40: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20  art<=iLast );.  
ab50: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
ab60: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab70: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
ab80: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
ab90: 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72   if( pbegin<addr
aba0: 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  +4 ){.      retu
abb0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
abc0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
abd0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
abe0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69  .  }.  if( pbegi
abf0: 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72  n>iLast ){.    r
ac00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ac10: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
ac20: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
ac30: 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d  addr || pbegin==
ac40: 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  0 );.  put2byte(
ac50: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61  &data[addr], sta
ac60: 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  rt);.  put2byte(
ac70: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62  &data[start], pb
ac80: 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74  egin);.  put2byt
ac90: 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d  e(&data[start+2]
aca0: 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  , size);.  pPage
acb0: 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d  ->nFree = pPage-
acc0: 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69  >nFree + (u16)si
acd0: 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73  ze;..  /* Coales
ace0: 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65  ce adjacent free
acf0: 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64   blocks */.  add
ad00: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77  r = hdr + 1;.  w
ad10: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
ad20: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
ad30: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
ad40: 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65  int pnext, psize
ad50: 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  , x;.    assert(
ad60: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
ad70: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
ad80: 69 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  in <= (int)pPage
ad90: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
ada0: 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74  e-4 );.    pnext
adb0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
adc0: 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20  a[pbegin]);.    
add0: 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  psize = get2byte
ade0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
adf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  );.    if( pbegi
ae00: 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d  n + psize + 3 >=
ae10: 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e   pnext && pnext>
ae20: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  0 ){.      int f
ae30: 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70  rag = pnext - (p
ae40: 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20  begin+psize);.  
ae50: 20 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29      if( (frag<0)
ae60: 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64   || (frag>(int)d
ae70: 61 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20  ata[hdr+7]) ){. 
ae80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ae90: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
aea0: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
aeb0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
aec0: 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20  (u8)frag;.      
aed0: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
aee0: 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20  ta[pnext]);.    
aef0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
af00: 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20  [pbegin], x);.  
af10: 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20      x = pnext + 
af20: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
af30: 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69  next+2]) - pbegi
af40: 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  n;.      put2byt
af50: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
af60: 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], x);.    }else
af70: 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  {.      addr = p
af80: 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begin;.    }.  }
af90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65  ..  /* If the ce
afa0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
afb0: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72  begins with a fr
afc0: 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20  eeblock, remove 
afd0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74  it. */.  if( dat
afe0: 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68  a[hdr+1]==data[h
aff0: 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64  dr+5] && data[hd
b000: 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36  r+2]==data[hdr+6
b010: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70  ] ){.    int top
b020: 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67  ;.    pbegin = g
b030: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b040: 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+1]);.    memcp
b050: 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  y(&data[hdr+1], 
b060: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32  &data[pbegin], 2
b070: 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  );.    top = get
b080: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b090: 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26  5]) + get2byte(&
b0a0: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
b0b0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
b0c0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
b0d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b0e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
b0f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
b100: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
b110: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b120: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
b130: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
b140: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b150: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
b160: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
b170: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
b180: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
b190: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
b1a0: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
b1b0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
b1c0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
b1d0: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
b1e0: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
b1f0: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
b200: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
b210: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
b220: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
b230: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
b240: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
b250: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
b260: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
b270: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
b280: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
b290: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
b2a0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
b2b0: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
b2c0: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
b2d0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
b2e0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b2f0: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
b300: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
b310: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
b320: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
b330: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
b340: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
b350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b360: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
b370: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
b380: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
b390: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
b3a0: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
b3b0: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
b3c0: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
b3d0: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
b3e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
b3f0: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
b400: 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  f;.  pBt = pPage
b410: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61  ->pBt;.  if( fla
b420: 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46  gByte==(PTF_LEAF
b430: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
b440: 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  Y) ){.    pPage-
b450: 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20  >intKey = 1;.   
b460: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
b470: 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  = pPage->leaf;. 
b480: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
b490: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
b4a0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
b4b0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
b4c0: 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69  nLeaf;.  }else i
b4d0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46  f( flagByte==PTF
b4e0: 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20  _ZERODATA ){.   
b4f0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
b500: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   0;.    pPage->h
b510: 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  asData = 0;.    
b520: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b530: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
b540: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
b550: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
b560: 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
b570: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b580: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b590: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
b5a0: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
b5b0: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
b5c0: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
b5d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b5e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
b5f0: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
b600: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
b610: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
b620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
b630: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
b640: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
b650: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
b660: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
b670: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
b680: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
b690: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
b6a0: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
b6b0: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
b6c0: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
b6d0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
b6e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
b6f0: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
b700: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
b710: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
b720: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
b730: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
b740: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
b750: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
b760: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
b770: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
b780: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b790: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
b7a0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
b7b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b7c0: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
b7d0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
b7e0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
b7f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
b800: 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
b810: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
b820: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b830: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
b840: 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
b850: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
b860: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
b870: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
b880: 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70  nit ){.    u16 p
b890: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
b8a0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
b8b0: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
b8c0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
b8d0: 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20  .    u8 hdr;    
b8e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
b8f0: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
b900: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
b910: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20  .    u8 *data;  
b920: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
b930: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
b940: 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64   */.    BtShared
b950: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
b960: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
b970: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
b980: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
b990: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
b9a0: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
b9b0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
b9c0: 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
b9d0: 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
b9e0: 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
b9f0: 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
ba00: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  pointer */.    i
ba10: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
ba20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
ba30: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
ba40: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
ba50: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
ba60: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
ba70: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
ba80: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20  ent area */.    
ba90: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
baa0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
bab0: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
bac0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
bad0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c  /.    int iCellL
bae0: 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
baf0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
bb00: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
bb10: 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d  et */..    pBt =
bb20: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
bb30: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
bb40: 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61  drOffset;.    da
bb50: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
bb60: 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64  a;.    if( decod
bb70: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
bb80: 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72  ta[hdr]) ) retur
bb90: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bba0: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
bbb0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
bbc0: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
bbd0: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
bbe0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  .    pPage->mask
bbf0: 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
bc00: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
bc10: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
bc20: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
bc30: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
bc40: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
bc50: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
bc60: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
bc70: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
bc80: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
bc90: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
bca0: 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69  = &data[usableSi
bcb0: 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze];.    pPage->
bcc0: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
bcd0: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
bce0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
bcf0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
bd00: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65  r+5]);.    pPage
bd10: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
bd20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
bd30: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
bd40: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
bd50: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
bd60: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
bd70: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
bd80: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
bd90: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
bda0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bdb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
bdc0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
bdd0: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
bde0: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
bdf0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66  ;..    /* A malf
be00: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
be10: 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
be20: 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20  us to read past 
be30: 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f  the end.    ** o
be40: 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
be50: 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
be60: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
be70: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
be80: 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65  of code checks e
be90: 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61  arly to see if a
bea0: 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20   cell extends.  
beb0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bec0: 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e  d of a page boun
bed0: 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20  dary and causes 
bee0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74  SQLITE_CORRUPT t
bef0: 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74  o be .    ** ret
bf00: 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
bf10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65  ..    */.    iCe
bf20: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
bf30: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
bf40: 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c  nCell;.    iCell
bf50: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
bf60: 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e  e - 4;.#if defin
bf70: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
bf80: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
bf90: 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20  HECK).    {.    
bfa0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
bfb0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
bfc0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bfd0: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
bfe0: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
bff0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
c000: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
c010: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
c020: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
c030: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c040: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
c050: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
c060: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c070: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
c080: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
c090: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
c0a0: 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  rst );.        t
c0b0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c0c0: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  llLast );.      
c0d0: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
c0e0: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
c0f0: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ast ){.         
c100: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c110: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
c120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
c130: 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
c140: 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
c150: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
c160: 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62  ase( pc+sz==usab
c170: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
c180: 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62    if( pc+sz>usab
c190: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c1a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c1b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c1c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c1d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
c1e0: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
c1f0: 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a  Last++;.    }  .
c200: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
c210: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
c220: 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74   free space on t
c230: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70  he page */.    p
c240: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
c250: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
c260: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
c270: 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77  +7] + top;.    w
c280: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
c290: 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69      u16 next, si
c2a0: 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63  ze;.      if( pc
c2b0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
c2c0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
c2d0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
c2e0: 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  of free block is
c2f0: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
c300: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c310: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c320: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
c330: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
c340: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
c350: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
c360: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
c370: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e  ]);.      if( (n
c380: 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70  ext>0 && next<=p
c390: 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b  c+size+3) || pc+
c3a0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
c3b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
c3c0: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
c3d0: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
c3e0: 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61  rder. And the la
c3f0: 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20  st byte of.     
c400: 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62     ** the free-b
c410: 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e  lock must lie on
c420: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
c430: 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
c440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c450: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
c460: 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
c470: 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
c480: 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
c490: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c4a0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
c4b0: 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
c4c0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
c4d0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
c4e0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  .    ** of the c
c4f0: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
c500: 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
c510: 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
c520: 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ithin.    ** the
c530: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
c540: 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
c550: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
c560: 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20  usable-size.    
c570: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
c580: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
c590: 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
c5a0: 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
c5b0: 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74  .    ** serves t
c5c0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
c5d0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c5e0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
c5f0: 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  l-content.    **
c600: 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
c610: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
c620: 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
c630: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a   the page..    *
c640: 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e  /.    if( nFree>
c650: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c660: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c670: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c680: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
c690: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c6a0: 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72  nFree - iCellFir
c6b0: 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  st);.    pPage->
c6c0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
c6d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c6e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
c6f0: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
c700: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
c710: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
c720: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
c730: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
c740: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
c750: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c760: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
c770: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c780: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
c790: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
c7a0: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
c7b0: 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
c7c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
c7d0: 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
c7e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c7f0: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
c800: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
c810: 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
c820: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c830: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
c840: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c850: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
c860: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c870: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
c880: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c890: 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
c8a0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c8b0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
c8c0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
c8d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c8e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
c8f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
c900: 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
c910: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
c920: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
c930: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
c940: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c950: 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64   - hdr);.  }.  d
c960: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
c970: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
c980: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
c990: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
c9a0: 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73  =0 ?1:0);.  mems
c9b0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
c9c0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
c9d0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
c9e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c9f0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
ca00: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ca10: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
ca20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
ca30: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
ca40: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
ca50: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
ca60: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
ca70: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
ca80: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
ca90: 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
caa0: 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
cab0: 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
cac0: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
cad0: 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
cae0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
caf0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
cb00: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
cb10: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
cb20: 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
cb30: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
cb40: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
cb50: 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
cb60: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
cb70: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
cb80: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
cb90: 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
cba0: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
cbb0: 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
cbc0: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
cbd0: 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
cbe0: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
cbf0: 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
cc00: 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
cc10: 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
cc20: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
cc30: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
cc40: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
cc50: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
cc60: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
cc70: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
cc80: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
cc90: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
cca0: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
ccb0: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
ccc0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
ccd0: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
cce0: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
ccf0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
cd00: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
cd10: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
cd20: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
cd30: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
cd40: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
cd50: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
cd60: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
cd70: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
cd80: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
cd90: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
cda0: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
cdb0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
cdc0: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
cdd0: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
cde0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
cdf0: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
ce00: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
ce10: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
ce20: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
ce30: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
ce40: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
ce50: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
ce60: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
ce70: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
ce80: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
ce90: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
cea0: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
ceb0: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
cec0: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
ced0: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
cee0: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
cef0: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
cf00: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
cf10: 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
cf20: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
cf30: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
cf40: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
cf50: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
cf60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
cf70: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
cf80: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
cf90: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
cfa0: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
cfb0: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
cfc0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
cfd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
cfe0: 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
cff0: 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
d000: 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
d010: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
d020: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
d030: 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
d040: 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
d050: 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
d060: 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
d070: 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
d080: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d090: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
d0a0: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
d0b0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
d0c0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
d0d0: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
d0e0: 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
d0f0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
d100: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
d110: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
d120: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
d130: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
d140: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d150: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
d160: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
d170: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
d180: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
d190: 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
d1a0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
d1b0: 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
d1c0: 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
d1d0: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
d1e0: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
d1f0: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
d200: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
d210: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
d220: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
d230: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
d240: 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
d250: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
d260: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d270: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d280: 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
d290: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
d2a0: 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
d2b0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
d2c0: 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
d2d0: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
d2e0: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
d2f0: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
d300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d310: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d320: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d330: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
d340: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
d350: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
d360: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
d370: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
d380: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
d390: 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
d3a0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
d3b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
d3c0: 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
d3d0: 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
d3e0: 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
d3f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
d400: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
d410: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
d420: 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
d430: 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  0x8000000)==0 );
d440: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62  .  return (int)b
d450: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
d460: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
d470: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
d480: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
d490: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
d4a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
d4b0: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
d4c0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
d4d0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
d4e0: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
d4f0: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
d500: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
d510: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d520: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
d530: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
d540: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
d550: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
d560: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
d570: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
d580: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
d590: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
d5a0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
d5b0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
d5c0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
d5d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
d5e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
d5f0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
d620: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
d630: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
d640: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
d650: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
d660: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
d670: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  re */.  int bRea
d680: 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  donly           
d690: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
d6a0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72  _GET_READONLY or
d6b0: 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72   0 */.){.  int r
d6c0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
d6d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d6e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d6f0: 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f 6e   assert( bReadon
d700: 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  ly==PAGER_GET_RE
d710: 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f  ADONLY || bReado
d720: 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  nly==0 );..  if(
d730: 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
d740: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
d750: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
d760: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
d770: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
d780: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
d790: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52 65  gno, ppPage, bRe
d7a0: 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28  adonly);.    if(
d7b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d7c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
d7d0: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
d7e0: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
d7f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d800: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
d810: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d820: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d830: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
d840: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
d850: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
d860: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
d870: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d880: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
d890: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
d8a0: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
d8b0: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
d8c0: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
d8d0: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
d8e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
d8f0: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
d900: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
d910: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
d920: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
d930: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
d940: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
d950: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
d960: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d970: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d980: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
d990: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
d9a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
d9b0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
d9c0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
d9d0: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
d9e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d9f0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
da00: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
da10: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
da20: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
da30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
da40: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
da50: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
da60: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
da70: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
da80: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
da90: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
daa0: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
dab0: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
dac0: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
dad0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
dae0: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
daf0: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
db00: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
db10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
db20: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
db30: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
db40: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
db50: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
db60: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
db70: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
db80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
db90: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
dba0: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
dbb0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
dbc0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
dbd0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
dbe0: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
dbf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dc00: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
dc10: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
dc20: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
dc30: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
dc40: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dc50: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
dc60: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
dc70: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
dc80: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
dc90: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
dca0: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
dcb0: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
dcc0: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
dcd0: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
dce0: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
dcf0: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
dd00: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
dd10: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
dd20: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
dd30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
dd40: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
dd50: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
dd60: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
dd70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dd80: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
dd90: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
dda0: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
ddb0: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
ddc0: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
ddd0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
dde0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
ddf0: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
de00: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
de10: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
de20: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
de30: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
de40: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
de50: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
de60: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
de70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
de80: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
de90: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
dea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
deb0: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
dec0: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
ded0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
dee0: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
def0: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
df00: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
df10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
df20: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
df30: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
df40: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
df50: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
df60: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
df70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
df80: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
df90: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
dfa0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
dfb0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
dfc0: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
dfd0: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
dfe0: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
dff0: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
e000: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
e010: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
e020: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
e030: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
e040: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
e050: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
e060: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
e070: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
e080: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
e090: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
e0a0: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
e0b0: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
e0c0: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
e0d0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
e0e0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
e0f0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
e100: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e110: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
e120: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
e130: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
e140: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
e150: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
e160: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
e170: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
e180: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
e190: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
e1a0: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
e1b0: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
e1c0: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
e1d0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
e1e0: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
e1f0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
e200: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
e210: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
e220: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
e230: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
e240: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
e250: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
e260: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
e270: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
e280: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
e290: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
e2a0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
e2b0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
e2c0: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
e2d0: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
e2e0: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
e2f0: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
e300: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
e310: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
e320: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
e330: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
e340: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
e350: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
e360: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
e370: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
e380: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
e390: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
e3a0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
e3b0: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
e3c0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
e3d0: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
e3e0: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
e3f0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
e400: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
e410: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
e420: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
e430: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
e440: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
e450: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
e460: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
e470: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
e480: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
e490: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e4a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
e4b0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
e4c0: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
e4d0: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
e4e0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
e4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
e500: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
e510: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
e520: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
e530: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
e540: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
e550: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
e560: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e570: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e580: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
e590: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
e5a0: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
e5b0: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
e5c0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
e5d0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
e5e0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
e5f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
e600: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
e610: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
e620: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
e630: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
e640: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
e650: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
e660: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
e670: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
e680: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
e690: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
e6a0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
e6b0: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
e6c0: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
e6d0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
e6e0: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
e6f0: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
e700: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
e710: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
e720: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
e730: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
e740: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
e750: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
e760: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
e770: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
e780: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
e790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e7a0: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
e7b0: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
e7c0: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
e7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e7e0: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
e7f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e800: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
e810: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
e820: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
e830: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
e840: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e850: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
e860: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
e870: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
e880: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
e890: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
e8a0: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
e8b0: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
e8c0: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
e8d0: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e8e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
e8f0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
e900: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
e910: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
e920: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
e930: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
e940: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
e950: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
e960: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
e970: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
e980: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
e990: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
e9a0: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
e9b0: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
e9c0: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
e9d0: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
e9e0: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
e9f0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
ea00: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
ea10: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
ea20: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
ea30: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
ea40: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
ea50: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
ea60: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
ea70: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
ea80: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
ea90: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
eaa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
eab0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
eac0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
ead0: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
eae0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
eaf0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
eb00: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
eb10: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
eb20: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
eb30: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
eb40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
eb50: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
eb60: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
eb70: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
eb80: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
eb90: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
eba0: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
ebb0: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
ebc0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
ebd0: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
ebe0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
ebf0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
ec00: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
ec10: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
ec20: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
ec30: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
ec40: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
ec50: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ec60: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
ec70: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
ec80: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
ec90: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
eca0: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
ecb0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ecc0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
ecd0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ece0: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
ecf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
ed00: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
ed10: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
ed20: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
ed30: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
ed40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ed50: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
ed60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
ed80: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
ed90: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
eda0: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
edb0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
edc0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
edd0: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
ede0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
edf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
ee00: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
ee10: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
ee50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ee60: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
ee70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ee80: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
ee90: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
eea0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
eeb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
eec0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
eed0: 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
eee0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
eef0: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
ef00: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ef10: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ef20: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
ef30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ef40: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
ef50: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
ef60: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
ef70: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
ef80: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
ef90: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
efa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
efb0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
efc0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
efd0: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
efe0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
eff0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
f000: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
f010: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
f020: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
f030: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f040: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
f050: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
f060: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
f070: 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
f0a0: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
f0b0: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
f0c0: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
f0d0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
f0e0: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
f0f0: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
f100: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
f110: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
f120: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
f130: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
f140: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
f150: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
f160: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f170: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f180: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
f190: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f1a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f1b0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
f1c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f1d0: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
f1e0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
f1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f200: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
f210: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f220: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
f230: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f250: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
f260: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
f270: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
f280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f290: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f2a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f2b0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
f2c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f2d0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
f2e0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
f2f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
f300: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
f310: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
f320: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
f330: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
f340: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
f350: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
f360: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
f370: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
f380: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
f390: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
f3a0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
f3b0: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
f3c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f3d0: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
f3e0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
f3f0: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
f400: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
f410: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
f420: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
f430: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
f440: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
f450: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
f460: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
f470: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
f480: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
f490: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
f4a0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
f4b0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
f4c0: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
f4d0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
f4e0: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
f4f0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
f500: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
f510: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
f520: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f530: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
f540: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
f550: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f560: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
f570: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
f580: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f590: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
f5a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f5b0: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
f5c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f5d0: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
f5e0: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
f5f0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
f600: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
f610: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
f620: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f630: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f640: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f650: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
f660: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f670: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
f680: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
f690: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
f6b0: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
f6c0: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
f6d0: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
f6e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
f700: 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
f710: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
f720: 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
f730: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f740: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
f750: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
f760: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
f770: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
f780: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f790: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
f7a0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
f7b0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
f7c0: 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
f7d0: 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
f7e0: 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
f7f0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
f800: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
f810: 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
f820: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
f830: 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
f840: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
f850: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
f860: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
f870: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
f880: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
f890: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
f8a0: 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
f8b0: 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
f8c0: 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
f8d0: 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
f8e0: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
f8f0: 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
f900: 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
f910: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f920: 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
f930: 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
f940: 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
f950: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
f960: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
f970: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
f980: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
f990: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
f9a0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
f9b0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
f9c0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
f9d0: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
f9e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f9f0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
fa00: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
fa10: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
fa20: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
fa30: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
fa40: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
fa50: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
fa60: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
fa70: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
fa80: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
fa90: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
faa0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
fab0: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
fac0: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
fad0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
fae0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
faf0: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
fb00: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
fb10: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
fb20: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
fb30: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
fb40: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
fb50: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
fb60: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
fb70: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
fb80: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
fb90: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
fba0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
fbb0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fbc0: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
fbd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
fbe0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
fbf0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
fc00: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
fc10: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
fc20: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
fc30: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
fc40: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
fc50: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
fc60: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
fc70: 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
fc80: 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
fc90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fca0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
fcb0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
fcc0: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
fcd0: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
fce0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
fcf0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
fd00: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
fd10: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
fd20: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
fd30: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
fd40: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
fd50: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
fd60: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
fd70: 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
fd80: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
fd90: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
fda0: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
fdb0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
fdc0: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
fdd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
fde0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
fdf0: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
fe00: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
fe10: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
fe20: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
fe30: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
fe40: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
fe50: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
fe60: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
fe70: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
fe80: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
fe90: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
fea0: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
feb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fec0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
fed0: 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
fee0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
fef0: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
ff00: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
ff10: 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
ff20: 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
ff30: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
ff40: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
ff50: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
ff60: 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
ff70: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
ff80: 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
ff90: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
ffa0: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
ffb0: 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
ffc0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
ffd0: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
ffe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
fff0: 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
10000 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10010 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10020 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
10030 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
10040 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
10050 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
10060 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10070 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10080 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
10090 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
100a0 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
100b0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
100c0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
100d0 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
100e0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
100f0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10100 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
10110 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10120 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
10130 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10140 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10150 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10160 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10170 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10180 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
10190 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
101a0 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
101b0 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
101c0 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
101d0 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
101e0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
101f0 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
10200 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
10210 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
10220 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
10230 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
10240 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
10250 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
10260 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
10270 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
10280 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
10290 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
102a0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
102b0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
102c0 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
102d0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
102e0 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
102f0 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
10300 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
10310 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
10320 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
10330 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
10340 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
10350 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
10360 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
10370 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
10380 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10390 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
103a0 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
103b0 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
103c0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
103d0 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
103e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
103f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
10400 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
10410 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
10420 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
10430 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
10440 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
10450 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
10460 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
10470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10480 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
10490 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
104a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
104b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
104c0 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
104d0 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
104e0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
104f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10500 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
10510 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
10520 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
10530 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
10540 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10550 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
10560 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10570 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
10580 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
10590 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
105a0 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
105b0 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
105c0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
105d0 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
105e0 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
105f0 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
10600 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
10610 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
10620 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
10630 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
10640 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
10650 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
10660 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
10670 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
10680 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10690 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
106a0 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
106b0 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
106c0 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
106d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
106e0 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
106f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10700 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
10710 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
10720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10730 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
10740 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10750 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
10760 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
10770 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
10780 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
10790 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
107a0 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
107b0 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
107c0 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
107d0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
107e0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
107f0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
10800 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
10810 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
10820 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
10830 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
10840 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
10850 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
10860 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
10870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10880 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
10890 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
108a0 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
108b0 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
108c0 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
108d0 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
108e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
108f0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
10900 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
10910 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
10920 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
10930 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
10940 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
10950 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
10960 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
10970 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
10980 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
10990 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
109a0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
109b0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
109c0 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
109d0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
109e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
109f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
10a00 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
10a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
10a20 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
10a30 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10a40 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
10a50 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
10a60 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
10a70 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
10a80 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
10a90 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
10aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10ab0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
10ac0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
10ad0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
10ae0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
10af0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
10b00 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
10b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10b20 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
10b30 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
10b40 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
10b50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10b60 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
10b70 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
10b80 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
10b90 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
10ba0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
10bb0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
10bc0 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
10bd0 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
10be0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
10bf0 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
10c00 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
10c10 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
10c20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
10c30 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
10c40 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
10c50 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
10c60 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
10c70 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
10c80 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
10c90 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
10ca0 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
10cb0 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
10cc0 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
10cd0 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
10ce0 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
10cf0 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
10d00 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
10d10 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
10d20 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
10d30 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
10d40 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
10d50 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
10d60 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
10d70 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
10d80 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
10d90 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
10da0 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
10db0 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
10dc0 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
10dd0 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
10de0 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
10df0 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
10e00 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
10e10 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
10e20 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
10e30 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
10e40 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
10e50 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
10e60 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
10e70 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
10e80 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
10e90 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
10ea0 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
10eb0 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
10ec0 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
10ed0 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
10ee0 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
10ef0 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
10f00 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
10f10 20 73 70 61 63 65 20 68 65 72 65 2e 20 20 2a 2f   space here.  */
10f20 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
10f30 6d 70 53 70 61 63 65 20 29 20 6d 65 6d 73 65 74  mpSpace ) memset
10f40 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
10f50 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 4);.  }.}../
10f60 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
10f70 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
10f80 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
10f90 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
10fa0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
10fb0 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
10fc0 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
10fd0 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
10fe0 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
10ff0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
11000 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
11010 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
11020 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
11030 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
11040 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
11050 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11060 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
11070 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
11080 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
11090 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
110a0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
110b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
110c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
110d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
110e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
110f0 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
11100 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
11110 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
11120 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
11130 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
11140 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
11150 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
11160 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
11170 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
11180 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
11190 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
111a0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
111b0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
111c0 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
111d0 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
111e0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
111f0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
11200 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
11210 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
11220 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
11230 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
11240 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
11250 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  ck(p, SQLITE_OK)
11260 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11270 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
11280 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
11290 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
112a0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
112b0 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
112c0 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
112d0 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
112e0 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
112f0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
11300 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
11310 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
11320 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11330 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
11340 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
11350 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
11360 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
11370 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
11380 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
11390 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
113a0 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
113b0 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
113c0 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
113d0 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
113e0 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
113f0 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
11400 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
11410 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
11420 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
11430 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11440 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
11450 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
11460 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
11470 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
11480 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
11490 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
114a0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
114b0 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
114c0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
114d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
114e0 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
114f0 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
11500 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
11510 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
11520 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
11530 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
11540 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
11550 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
11560 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11570 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
11580 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
11590 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
115a0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
115b0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
115c0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
115d0 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
115e0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
115f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
11600 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11610 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
11620 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
11630 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
11640 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
11650 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
11660 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
11670 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
11680 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
11690 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
116a0 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
116b0 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
116c0 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
116d0 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
116e0 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
116f0 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
11700 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
11710 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
11720 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
11730 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
11740 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
11750 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
11760 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
11770 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
11780 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
11790 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
117a0 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
117b0 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
117c0 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
117d0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
117e0 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
117f0 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
11800 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
11810 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
11820 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
11830 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
11840 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
11850 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
11860 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
11870 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
11880 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
11890 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
118a0 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
118b0 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
118c0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
118d0 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
118e0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
118f0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
11900 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11910 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
11920 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11930 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
11940 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11950 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
11960 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
11970 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
11980 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
11990 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
119a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
119b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
119c0 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
119d0 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
119e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
119f0 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ile that may be.
11a00 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ** memory mapped
11a10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11a20 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
11a30 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69  t(Btree *p, sqli
11a40 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
11a50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11a60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
11a70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11a80 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
11a90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
11aa0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11ab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
11ac0 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
11ad0 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61  t->pPager, szMma
11ae0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
11af0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11b10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
11b20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
11b30 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
11b40 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
11b50 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
11b60 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
11b70 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
11b80 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
11b90 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
11ba0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
11bb0 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
11bc0 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
11bd0 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
11be0 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
11bf0 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
11c00 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
11c10 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
11c20 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
11c30 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
11c40 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
11c50 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
11c60 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
11c70 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
11c80 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
11c90 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
11ca0 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
11cb0 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
11cc0 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
11cd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11ce0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
11cf0 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
11d00 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
11d10 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
11d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11d30 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
11d40 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
11d50 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
11d60 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
11d70 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
11d80 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
11d90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11da0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
11db0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11dc0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
11dd0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
11de0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11df0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
11e00 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
11e10 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
11e20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11e30 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11e40 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11e50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11e60 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11e70 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
11e80 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
11e90 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
11ea0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
11eb0 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
11ec0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
11ed0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
11ee0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
11ef0 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
11f00 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11f10 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
11f20 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
11f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11f40 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11f50 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
11f60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11f70 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
11f80 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
11f90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11fa0 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
11fb0 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
11fc0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11fe0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
11ff0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
12000 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
12010 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
12020 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
12030 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
12040 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
12050 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
12060 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
12070 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
12080 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
12090 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
120a0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
120b0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
120c0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
120d0 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
120e0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
120f0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
12100 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
12110 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
12120 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
12130 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
12140 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
12150 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
12160 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
12170 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
12180 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
12190 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
121a0 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
121b0 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
121c0 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
121d0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
121e0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
121f0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
12200 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
12210 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
12220 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
12230 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
12240 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
12250 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
12260 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
12270 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
12280 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
12290 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
122a0 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
122b0 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
122c0 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
122d0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
122e0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
122f0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
12300 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
12310 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
12320 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12330 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
12340 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
12350 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
12360 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
12370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12380 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12390 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
123a0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
123b0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
123c0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
123d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
123e0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
123f0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
12400 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
12410 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12420 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
12430 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12440 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
12450 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
12460 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
12470 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
12480 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
12490 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
124a0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
124b0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
124c0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
124d0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
124e0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
124f0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
12500 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
12510 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
12520 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
12530 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12540 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
12550 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
12560 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
12570 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
12580 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
12590 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
125a0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
125b0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
125c0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
125d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
125e0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
125f0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
12600 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
12610 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
12620 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
12630 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
12640 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_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 72 65 74 75 72 6e 20 72  e(p);.  return r
12670 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
12680 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
12690 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
126a0 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
126b0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
126c0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
126d0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
126e0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64  geSize;.}..#if d
126f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
12700 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
12710 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
12720 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  )./*.** This fun
12730 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
12740 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
12750 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
12760 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
12770 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
12780 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
12790 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
127a0 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
127b0 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
127c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
127d0 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
127e0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
127f0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
12800 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
12810 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
12820 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
12830 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
12840 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
12850 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
12860 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12870 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
12880 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
12890 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
128a0 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
128b0 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
128c0 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
128d0 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
128e0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
128f0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
12900 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
12910 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
12920 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
12930 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
12940 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
12950 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12960 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12970 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
12980 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  ;.  return p->pB
12990 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
129a0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
129b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
129c0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c  LITE_HAS_CODEC |
129d0 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  | SQLITE_DEBUG *
129e0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
129f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
12a00 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
12a10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12a20 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
12a30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12a40 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
12a50 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
12a60 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
12a70 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
12a80 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
12a90 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
12aa0 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
12ab0 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
12ac0 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
12ad0 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
12ae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12af0 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
12b00 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
12b10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12b20 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
12b30 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
12b40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
12b50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12b60 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12b70 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
12b80 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
12b90 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
12ba0 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
12bb0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
12bc0 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
12bd0 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
12be0 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
12bf0 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
12c00 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
12c10 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
12c20 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
12c30 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
12c40 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
12c50 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
12c60 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
12c70 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
12c80 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12c90 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
12ca0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
12cb0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
12cc0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
12cd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12ce0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
12cf0 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f  .** Set the BTS_
12d00 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c  SECURE_DELETE fl
12d10 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ag if newFlag is
12d20 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77   0 or 1.  If new
12d30 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74  Flag is -1,.** t
12d40 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  hen make no chan
12d50 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ges.  Always ret
12d60 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
12d70 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
12d80 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e  DELETE.** settin
12d90 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  g after the chan
12da0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
12db0 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
12dc0 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
12dd0 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
12de0 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
12df0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
12e00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12e10 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61  p);.  if( newFla
12e20 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
12e30 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
12e40 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  ~BTS_SECURE_DELE
12e50 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46  TE;.    if( newF
12e60 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74  lag ) p->pBt->bt
12e70 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
12e80 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  CURE_DELETE;.  }
12e90 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d   .  b = (p->pBt-
12ea0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
12eb0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d  SECURE_DELETE)!=
12ec0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
12ed0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12ee0 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn b;.}.#endif 
12ef0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
12f00 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
12f10 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
12f20 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12f30 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
12f40 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
12f50 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
12f60 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
12f70 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
12f80 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
12f90 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
12fa0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
12fb0 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
12fc0 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
12fd0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
12fe0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
12ff0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
13000 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
13010 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
13020 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
13030 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
13040 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
13050 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
13060 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
13070 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
13080 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
13090 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
130a0 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
130b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
130c0 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
130d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
130e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
130f0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
13100 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
13110 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13120 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
13130 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
13140 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
13150 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
13160 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
13170 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
13180 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
131a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
131b0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
131c0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
131d0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
131e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
131f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13200 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
13210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
13220 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
13230 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
13240 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
13250 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
13260 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
13270 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
13280 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
13290 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
132a0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
132b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
132c0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
132d0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
132e0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
132f0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
13300 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13310 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
13320 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
13330 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
13340 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
13350 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
13360 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
13370 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
13380 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
13390 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
133a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
133b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
133c0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
133d0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
133e0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
133f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
13400 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
13410 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
13420 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
13430 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
13440 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
13450 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
13460 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
13470 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
13480 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
13490 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
134a0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
134b0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
134c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
134d0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
134e0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
134f0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
13500 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
13510 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
13520 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
13530 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
13540 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
13550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13560 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
13570 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
13580 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
13590 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
135a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
135b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
135c0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
135d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
135e0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
135f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
13600 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
13610 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
13620 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13630 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
13640 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
13650 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13660 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13670 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
13680 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
13690 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
136a0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
136b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
136c0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
136d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
136e0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
136f0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
13700 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
13710 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
13720 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
13730 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13740 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
13750 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
13760 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
13770 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
13780 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
13790 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
137a0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
137b0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
137c0 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
137d0 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
137e0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
137f0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
13800 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
13810 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
13820 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
13830 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
13840 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
13850 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
13860 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
13870 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
13880 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
13890 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
138a0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
138b0 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
138c0 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
138d0 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
138e0 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
138f0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
13900 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
13910 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
13920 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
13930 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
13940 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13950 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
13960 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
13970 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
13980 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
13990 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
139a0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
139b0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
139c0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
139d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
139e0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
139f0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
13a00 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
13a10 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
13a20 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
13a30 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
13a40 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
13a50 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
13a60 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13a70 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
13a80 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
13a90 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
13aa0 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
13ab0 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
13ac0 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
13ad0 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
13ae0 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
13af0 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
13b00 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
13b10 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
13b20 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
13b30 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
13b40 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
13b50 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
13b60 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
13b70 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
13b80 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
13b90 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
13ba0 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
13bb0 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
13bc0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
13bd0 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
13be0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
13bf0 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
13c00 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
13c10 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
13c20 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
13c30 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
13c40 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
13c50 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
13c60 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
13c70 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
13c80 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
13c90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13ca0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
13cb0 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
13cc0 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
13cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13ce0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
13cf0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13d00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13d10 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  isOpen==0 ){.   
13d20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
13d30 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
13d40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13d50 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
13d60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
13d70 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  TADB;.    }.#end
13d80 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  if..    /* The m
13d90 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
13da0 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
13db0 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
13dc0 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
13dd0 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
13de0 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
13df0 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
13e00 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
13e10 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
13e20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
13e30 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
13e40 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
13e50 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
13e60 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
13e70 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
13e80 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
13e90 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
13ea0 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
13eb0 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
13ec0 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
13ed0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13ee0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13ef0 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
13f00 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
13f10 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
13f20 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
13f30 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
13f40 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
13f50 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
13f60 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
13f70 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
13f80 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
13f90 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13fa0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
13fb0 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
13fc0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
13fd0 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
13fe0 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
13ff0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
14000 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
14010 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
14020 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
14030 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
14040 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
14050 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
14060 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
14070 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
14080 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
14090 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
140a0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
140b0 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
140c0 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
140d0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
140e0 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
140f0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
14100 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
14110 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
14120 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
14130 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
14140 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
14150 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
14160 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
14170 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
14180 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
14190 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
141a0 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
141b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
141c0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
141d0 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
141e0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
141f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14200 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
14210 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
14220 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
14250 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a  geSize-usableSiz
14260 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
14270 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
14280 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
14290 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f  gs & SQLITE_Reco
142a0 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20  veryMode)==0 && 
142b0 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20  nPage>nPageFile 
142c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
142d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
142e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
142f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14300 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
14310 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b  sableSize<480 ){
14320 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
14330 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
14340 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
14350 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
14360 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
14370 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
14380 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
14390 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
143a0 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
143b0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
143c0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
143d0 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
143e0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
143f0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
14400 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
14410 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
14420 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
14430 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
14440 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
14450 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
14460 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
14470 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
14480 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
14490 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
144a0 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
144b0 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
144c0 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
144d0 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
144e0 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
144f0 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
14500 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
14510 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
14520 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
14530 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
14540 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
14550 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
14560 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
14570 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
14580 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
14590 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
145a0 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
145b0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
145c0 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
145d0 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
145e0 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65  te pointer, a he
145f0 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
14600 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
14610 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
14620 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
14630 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
14640 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
14650 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
14660 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
14670 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
14680 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
14690 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
146a0 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
146b0 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  minLocal = (u16)
146c0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
146d0 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
146e0 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  3);.  pBt->maxLe
146f0 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  af = (u16)(pBt->
14700 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29  usableSize - 35)
14710 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
14720 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
14730 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
14740 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66  /255 - 23);.  if
14750 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e  ( pBt->maxLocal>
14760 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  127 ){.    pBt->
14770 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
14780 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 127;.  }else{.
14790 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
147a0 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70  ePayload = (u8)p
147b0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
147c0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
147d0 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
147e0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
147f0 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
14800 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
14810 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
14820 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
14830 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
14840 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
14850 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14860 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
14870 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
14880 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
14890 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
148a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
148b0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
148c0 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
148d0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
148e0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
148f0 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
14900 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
14910 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
14920 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
14930 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
14940 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
14950 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
14960 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
14970 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
14980 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
14990 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
149a0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
149b0 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
149c0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
149d0 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
149e0 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
149f0 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
14a00 20 64 61 74 61 62 73 65 2e 20 20 43 75 72 73 6f   databse.  Curso
14a10 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20  rs that.** have 
14a20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74  been tripped int
14a30 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55  o the CURSOR_FAU
14a40 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74  LT state are not
14a50 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61   counted..*/.sta
14a60 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c  tic int countVal
14a70 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  idCursors(BtShar
14a80 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f  ed *pBt, int wrO
14a90 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
14aa0 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
14ab0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
14ac0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
14ad0 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
14ae0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
14af0 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 43 75  wrOnly==0 || pCu
14b00 72 2d 3e 77 72 46 6c 61 67 29 20 26 26 20 70 43  r->wrFlag) && pC
14b10 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
14b20 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
14b30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
14b40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14b50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
14b60 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
14b70 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
14b80 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
14b90 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
14ba0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
14bb0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
14bc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
14bd0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
14be0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
14bf0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
14c00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14c10 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
14c20 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
14c30 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
14c40 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
14c50 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
14c60 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
14c70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
14c80 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
14c90 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
14ca0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
14cb0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14cc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14cd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14ce0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
14cf0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
14d00 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
14d10 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
14d20 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
14d30 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
14d40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
14d50 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
14d60 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
14d70 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
14d80 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
14d90 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14da0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
14db0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
14dc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14dd0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
14de0 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ta );.    releas
14df0 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  ePage(pBt->pPage
14e00 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61  1);.    pBt->pPa
14e10 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge1 = 0;.  }.}..
14e20 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
14e30 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
14e40 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
14e50 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
14e60 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
14e70 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
14e80 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
14e90 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
14ea0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14ec0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
14ed0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
14ee0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
14ef0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
14f00 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
14f10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14f20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14f30 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
14f40 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
14f50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14f60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
14f70 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
14f80 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
14f90 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
14fa0 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
14fb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
14fc0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
14fd0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14fe0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
14ff0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
15000 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
15010 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
15020 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
15030 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
15040 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
15050 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
15060 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
15070 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
15080 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
15090 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
150a0 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
150b0 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
150c0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
150d0 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
150e0 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
150f0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
15100 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
15110 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
15120 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
15130 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
15140 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
15150 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
15160 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
15170 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
15180 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
15190 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
151a0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
151b0 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
151c0 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
151d0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
151e0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
151f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15200 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
15210 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
15220 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
15230 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
15240 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
15250 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
15260 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
15270 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
15280 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
15290 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
152a0 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
152b0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
152c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
152d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
152e0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
152f0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
15300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15310 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
15320 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
15330 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
15340 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
15350 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
15360 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
15370 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
15380 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
15390 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
153a0 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
153b0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
153c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
153d0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
153e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
153f0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
15400 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
15410 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15420 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
15430 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
15440 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
15450 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15460 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15470 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
15480 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
15490 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
154a0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
154b0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
154c0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
154d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
154e0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
154f0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
15500 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
15510 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15520 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
15530 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
15540 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
15550 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
15560 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
15570 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
15580 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
15590 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
155a0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
155b0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
155c0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
155d0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
155e0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
155f0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
15600 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
15610 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
15620 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
15630 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
15640 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
15650 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
15660 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
15670 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
15680 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
15690 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
156a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
156b0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
156c0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
156d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
156e0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
156f0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
15700 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
15710 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15720 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
15730 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
15740 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
15750 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
15760 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
15770 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
15780 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
15790 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
157a0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
157b0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
157c0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
157d0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
157e0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
157f0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
15800 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
15810 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
15820 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
15830 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
15840 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
15850 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
15860 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
15870 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
15880 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
15890 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
158a0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
158b0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
158c0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
158d0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
158e0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
158f0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
15900 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
15910 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
15920 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
15930 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
15940 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
15950 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
15960 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
15970 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
15980 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
15990 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
159a0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
159b0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
159c0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
159d0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
159e0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
159f0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
15a00 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
15a10 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
15a20 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
15a30 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
15a40 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
15a50 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
15a60 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
15a70 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
15a80 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
15a90 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
15aa0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
15ab0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
15ac0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
15ad0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
15ae0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
15af0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
15b00 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
15b10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15b20 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
15b30 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
15b40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
15b50 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
15b60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15b70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
15b80 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
15b90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15ba0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
15bb0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
15bc0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
15bd0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
15be0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
15bf0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
15c00 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
15c10 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
15c20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
15c30 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
15c40 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
15c50 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
15c60 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15c70 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
15c80 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
15c90 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
15ca0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
15cb0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
15cc0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
15cd0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
15ce0 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
15cf0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
15d00 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
15d10 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
15d20 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
15d30 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
15d40 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
15d50 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
15d60 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
15d70 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
15d80 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
15d90 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15da0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
15db0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
15dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15dd0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15de0 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
15df0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
15e00 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
15e10 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
15e20 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
15e30 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
15e40 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
15e50 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
15e60 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
15e70 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
15e80 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
15e90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
15ea0 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
15eb0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
15ec0 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
15ed0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15ee0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
15ef0 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
15f00 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
15f10 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
15f20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
15f30 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
15f40 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
15f50 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
15f60 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
15f70 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
15f80 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
15f90 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
15fa0 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
15fb0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
15fc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15fd0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
15fe0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
15ff0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
16000 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
16010 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
16020 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
16030 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
16040 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
16050 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16060 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
16070 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
16080 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
16090 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
160a0 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
160b0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
160c0 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
160d0 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
160e0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
160f0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
16100 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
16110 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
16120 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
16130 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
16140 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
16150 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
16160 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
16170 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
16180 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
16190 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
161a0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
161b0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
161c0 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
161d0 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
161e0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
161f0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
16200 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
16210 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
16220 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
16230 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
16240 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
16250 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
16260 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
16270 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
16280 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
16290 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
162a0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
162b0 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
162c0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
162d0 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
162e0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
162f0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
16300 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
16310 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
16320 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
16330 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
16340 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
16350 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
16360 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
16370 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
16380 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
16390 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
163a0 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
163b0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
163c0 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
163d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
163e0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
163f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
16400 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16410 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
16420 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16430 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16450 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16460 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
16470 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
16480 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
16490 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
164a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
164b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
164c0 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
164d0 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
164e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
164f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
16500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16510 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
16520 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
16530 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
16540 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
16550 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
16560 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
16570 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
16580 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
16590 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
165a0 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
165b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
165c0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
165d0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
165e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
165f0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
16600 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16610 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
16620 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
16630 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
16640 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
16650 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
16660 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
16670 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
16680 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
16690 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
166a0 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
166b0 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
166c0 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
166d0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
166e0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
166f0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
16700 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
16710 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
16720 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
16730 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
16740 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
16750 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
16760 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
16770 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
16780 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
16790 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
167a0 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
167b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
167c0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
167d0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
167e0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
167f0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
16800 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
16810 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
16820 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
16830 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
16840 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16850 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
16860 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
16870 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
16880 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
16890 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
168a0 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
168b0 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
168c0 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
168d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
168e0 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
168f0 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
16900 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
16910 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
16920 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
16930 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
16940 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
16950 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
16960 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
16970 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
16980 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
16990 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
169a0 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
169b0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
169c0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
169d0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
169e0 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
169f0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
16a00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
16a10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16a20 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
16a30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16a50 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
16a60 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
16a70 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
16a80 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
16a90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16aa0 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
16ab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16ac0 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
16ad0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
16ae0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
16af0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
16b00 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
16b10 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
16b20 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
16b30 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
16b40 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
16b50 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
16b60 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
16b70 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
16b80 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
16b90 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
16ba0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
16bb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16bc0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
16bd0 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
16be0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
16bf0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
16c00 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
16c10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16c20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16c40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16c50 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
16c60 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
16c70 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
16c80 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
16c90 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
16ca0 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
16cb0 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
16cc0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
16cd0 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
16ce0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
16cf0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
16d00 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
16d10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
16d20 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
16d30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
16d40 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d60 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
16d70 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
16d80 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
16db0 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
16dc0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16df0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
16e00 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
16e10 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
16e20 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
16e30 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
16e40 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
16e50 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
16e60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16e70 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
16e80 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
16e90 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
16ea0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
16eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16ec0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
16ed0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
16ee0 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
16ef0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
16f00 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
16f10 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
16f20 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
16f30 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
16f40 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
16f50 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
16f60 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
16f70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
16f80 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
16f90 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
16fa0 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
16fb0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
16fc0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
16fd0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
16fe0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
16ff0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
17000 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
17010 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
17020 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
17030 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
17040 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
17050 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
17060 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
17070 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
17080 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
17090 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
170a0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
170b0 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
170c0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
170d0 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
170e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
170f0 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
17100 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
17110 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
17120 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
17130 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
17140 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
17150 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
17160 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
17170 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
17180 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
17190 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
171a0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
171b0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
171c0 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
171d0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
171e0 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
171f0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
17200 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
17210 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
17220 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
17230 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
17260 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
17270 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
17280 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
17290 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
172a0 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
172b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
172c0 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
172d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
172e0 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
172f0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
17300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
17310 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
17320 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
17330 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
17340 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
17350 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17360 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
17370 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
17380 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
17390 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
173a0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
173b0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
173c0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
173d0 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
173e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
173f0 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
17400 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
17410 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
17420 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
17430 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
17440 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
17450 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17460 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
17480 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
17490 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
174a0 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
174b0 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
174c0 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
174d0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
174e0 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
174f0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43  e(pPage);.    nC
17500 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
17510 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
17520 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
17530 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
17540 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
17550 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
17560 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
17570 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
17580 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
17590 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  o;.        btree
175a0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
175b0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
175c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
175d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20  nfo.iOverflow.  
175e0 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
175f0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
17600 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
17610 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
17620 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
17630 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
17640 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
17650 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ]).        ){.  
17660 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
17670 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
17680 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
17690 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
176a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
176b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
176c0 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
176d0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
176e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
176f0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
17700 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17720 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
17730 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
17740 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
17750 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
17760 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
17770 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
17780 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
17790 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
177a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
177b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
177c0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
177d0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
177e0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
177f0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
17800 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
17810 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
17820 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
17830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17840 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
17850 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
17860 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
17870 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
17880 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
17890 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
178a0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
178b0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
178c0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
178d0 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
178e0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
178f0 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
17900 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
17910 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
17920 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
17930 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
17940 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
17950 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
17960 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
17970 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
17980 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
17990 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
179a0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
179b0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
179c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
179d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
179e0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
179f0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
17a00 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
17a10 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
17a20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
17a30 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17a40 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
17a50 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
17a60 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
17a70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
17a80 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
17a90 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
17aa0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
17ab0 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
17ac0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
17ad0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
17ae0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
17af0 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
17b00 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
17b10 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
17b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
17b30 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
17b40 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
17b50 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
17b60 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
17b70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
17b80 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
17b90 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
17ba0 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
17bb0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
17bc0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
17bd0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
17be0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
17bf0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
17c00 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
17c10 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
17c20 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
17c30 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
17c40 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
17c50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17c60 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
17c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
17c80 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
17c90 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
17ca0 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
17cb0 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
17cc0 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
17cd0 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
17ce0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
17cf0 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
17d00 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
17d10 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
17d20 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
17d30 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
17d40 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
17d50 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
17d60 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17d70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
17d80 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
17d90 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
17da0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
17db0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17dd0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
17de0 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
17df0 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
17e00 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
17e10 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
17e20 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
17e30 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
17e40 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
17e50 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
17e60 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
17e70 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
17e80 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
17e90 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
17ea0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
17eb0 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
17ec0 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
17ed0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
17ee0 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
17ef0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
17f00 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
17f10 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
17f20 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
17f30 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
17f40 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
17f50 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
17f60 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
17f70 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
17f80 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
17f90 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
17fa0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
17fb0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
17fc0 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
17fd0 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
17fe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17ff0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
18000 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
18010 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
18020 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
18030 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
18040 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
18050 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
18060 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
18070 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
18080 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
18090 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
180a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
180b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
180c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
180d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
180e0 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
180f0 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
18100 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
18110 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
18120 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
18130 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
18140 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
18150 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
18160 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
18170 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
18180 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
18190 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
181a0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
181b0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
181c0 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
181d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
181e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
181f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18200 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
18210 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
18220 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
18230 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
18240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18250 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18260 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
18270 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18280 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
18290 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
182a0 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
182b0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
182c0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
182d0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
182e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
182f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
18300 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
18310 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
18320 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
18330 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18340 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
18350 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
18360 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
18370 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
18380 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
18390 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
183a0 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
183b0 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
183c0 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
183d0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
183e0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
183f0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
18400 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
18410 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
18420 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
18430 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
18440 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
18450 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
18460 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
18470 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
18480 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
18490 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
184a0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
184b0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
184c0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
184d0 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
184e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
184f0 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
18500 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
18510 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
18520 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
18530 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
18540 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
18550 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
18560 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
18570 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
18580 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
18590 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
185a0 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
185b0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
185c0 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
185d0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
185e0 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
185f0 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
18600 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
18610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18620 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
18630 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
18640 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
18650 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
18660 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
18670 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
18680 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
18690 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
186a0 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
186b0 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74  acuum-on-commmit
186c0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
186d0 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
186e0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
186f0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
18700 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
18710 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
18720 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
18730 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
18740 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
18750 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
18760 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18770 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
18780 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
18790 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
187a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
187b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
187c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
187d0 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
187e0 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
187f0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
18800 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
18810 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18820 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
18830 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
18840 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
18850 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
18860 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
18870 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
18880 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
18890 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
188a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
188b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
188c0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
188d0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
188e0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
188f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
18910 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18920 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
18930 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
18940 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18950 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18960 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
18970 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
18980 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
18990 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
189a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
189b0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
189c0 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
189d0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
189e0 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
189f0 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
18a00 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
18a10 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
18a20 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
18a30 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
18a40 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
18a50 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
18a60 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
18a70 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
18a80 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
18a90 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
18aa0 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
18ab0 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
18ac0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
18ad0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
18ae0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
18af0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
18b00 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
18b10 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
18b20 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
18b30 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
18b40 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
18b50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
18b70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
18b80 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
18b90 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
18ba0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
18bb0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
18bc0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
18bd0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
18be0 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
18bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18c00 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
18c10 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
18c20 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
18c30 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
18c40 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
18c50 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
18c60 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
18c70 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
18c80 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
18c90 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
18ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
18cb0 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
18cc0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
18cd0 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
18ce0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
18cf0 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
18d00 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
18d10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18d40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
18d50 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
18d60 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
18d70 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
18d80 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
18d90 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
18da0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
18db0 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
18dc0 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
18dd0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
18de0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
18df0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
18e00 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
18e10 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
18e20 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
18e30 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
18e40 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
18e50 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
18e60 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
18e70 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
18e80 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
18e90 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
18ea0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
18eb0 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
18ec0 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
18ed0 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
18ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
18ef0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
18f00 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
18f10 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
18f20 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
18f30 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
18f40 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
18f50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18f60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18f70 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
18f80 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
18f90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18fa0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
18fb0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18fc0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
18fd0 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
18fe0 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
18ff0 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
19000 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
19010 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
19020 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
19030 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
19040 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
19050 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
19060 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
19070 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
19080 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
19090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
190a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
190b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
190c0 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
190d0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
190e0 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
190f0 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
19100 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
19110 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
19120 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
19130 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
19140 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
19150 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
19160 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
19170 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
19180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19190 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
191a0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
191b0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
191c0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
191d0 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
191e0 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
191f0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
19200 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
19210 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
19220 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
19230 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
19240 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
19250 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
19260 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
19270 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
19280 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
19290 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
192a0 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
192b0 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
192d0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
192e0 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
192f0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
19300 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
19310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19320 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
19330 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
19340 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
19370 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
19380 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
19390 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
193a0 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
193b0 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
193c0 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
193d0 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
193e0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
193f0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
19400 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
19410 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
19420 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
19430 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
19440 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
19450 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
19460 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
19470 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
19480 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
19490 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
194a0 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
194b0 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
194c0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
194d0 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
194e0 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
194f0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
19500 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
19510 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
19520 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
19530 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
19540 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
19550 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
19560 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
19570 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
19580 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
19590 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
195a0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
195b0 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
195c0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
195d0 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
195e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
195f0 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
19600 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
19610 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
19620 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
19630 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19640 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
19650 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19660 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19670 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
19680 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
19690 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
196a0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
196b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
196c0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
196d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
196e0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
196f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
19700 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
19710 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
19720 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
19730 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
19740 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
19750 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
19760 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
19770 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
19780 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
19790 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
197a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
197b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
197c0 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
197d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
197e0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
197f0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
19800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19810 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
19820 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
19830 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
19840 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
19850 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
19860 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
19870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19890 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
198a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
198b0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
198c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
198d0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
198e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
198f0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
19900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
19910 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
19920 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
19930 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
19940 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
19950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19960 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19970 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
19980 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
19990 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
199a0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
199b0 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
199c0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
199d0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
199e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
199f0 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
19a00 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
19a10 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
19a20 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
19a30 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
19a40 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
19a50 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
19a60 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
19a70 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
19a80 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
19a90 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
19aa0 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
19ab0 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
19ac0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
19ad0 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
19ae0 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
19af0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
19b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19b10 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
19b20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
19b30 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
19b40 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
19b50 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
19b60 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   );..  assert( s
19b70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19b80 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19b90 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
19ba0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
19bb0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
19bc0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
19bd0 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
19be0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
19bf0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
19c00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
19c10 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
19c20 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
19c30 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
19c40 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
19c50 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19c60 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
19c70 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
19c80 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
19c90 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
19ca0 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
19cb0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
19cc0 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
19cd0 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
19ce0 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
19cf0 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
19d00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
19d10 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
19d20 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
19d30 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
19d40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
19d50 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
19d60 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
19d70 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
19d80 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
19d90 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
19da0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
19db0 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
19dc0 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
19dd0 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
19de0 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
19df0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
19e00 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
19e10 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
19e20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19e30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
19e40 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
19e50 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
19e60 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
19e70 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
19e80 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
19e90 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
19ea0 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
19eb0 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
19ec0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19ed0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
19ee0 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
19ef0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
19f00 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
19f10 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
19f20 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
19f30 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
19f40 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
19f50 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
19f60 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
19f70 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
19f80 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
19f90 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
19fa0 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
19fb0 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
19fc0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
19fd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19fe0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
19ff0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
1a000 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1a010 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1a020 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1a030 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1a040 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
1a050 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1a060 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1a070 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
1a080 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
1a090 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1a0a0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1a0b0 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
1a0c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a0d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a0e0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1a0f0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1a100 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
1a110 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
1a120 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1a130 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a140 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
1a150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a160 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
1a170 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
1a180 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
1a190 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
1a1a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1a1b0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1a1c0 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
1a1d0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
1a1e0 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
1a1f0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
1a200 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
1a210 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
1a220 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
1a230 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
1a240 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
1a250 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
1a260 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
1a270 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
1a280 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
1a290 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1a2a0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
1a2b0 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
1a2c0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
1a2d0 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
1a2e0 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
1a2f0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
1a300 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
1a310 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
1a320 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
1a330 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
1a340 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
1a350 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
1a360 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
1a370 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
1a380 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
1a390 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
1a3a0 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
1a3b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a3c0 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
1a3d0 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
1a3e0 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
1a3f0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
1a400 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
1a410 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
1a420 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
1a430 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a440 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
1a450 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1a460 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
1a470 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
1a480 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
1a490 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
1a4a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
1a4b0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
1a4c0 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
1a4d0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
1a4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a4f0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
1a500 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
1a510 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
1a520 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
1a530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1a540 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1a550 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
1a560 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
1a570 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
1a580 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
1a590 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
1a5a0 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
1a5b0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1a5c0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1a5d0 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
1a5e0 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
1a5f0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
1a600 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
1a610 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
1a620 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
1a630 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1a640 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
1a650 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
1a660 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
1a670 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
1a680 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
1a690 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
1a6a0 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
1a6b0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
1a6c0 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
1a6d0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1a6e0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
1a6f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a700 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
1a710 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1a720 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
1a730 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a740 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
1a750 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1a760 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1a770 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1a780 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1a790 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
1a7a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a7b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1a7c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1a7d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
1a7e0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
1a7f0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
1a800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1a820 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a830 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a850 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
1a860 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1a870 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1a880 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
1a890 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
1a8a0 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
1a8b0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
1a8c0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1a8d0 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
1a8e0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
1a8f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a900 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1a910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a920 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1a930 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
1a940 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
1a950 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
1a960 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
1a970 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
1a980 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
1a990 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1a9a0 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
1a9b0 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
1a9c0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1a9d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1a9e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1a9f0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1aa00 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1aa10 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
1aa20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1aa30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
1aa40 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1aa50 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
1aa60 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1aa70 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
1aa80 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
1aa90 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1aaa0 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1aab0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1aac0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1aad0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1aae0 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1aaf0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1ab00 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1ab10 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1ab20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1ab30 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1ab40 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1ab50 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1ab60 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1ab70 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1ab80 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1ab90 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1aba0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1abb0 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1abc0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1abd0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1abe0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1abf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ac00 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1ac10 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1ac20 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1ac30 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1ac40 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1ac50 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1ac60 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1ac70 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1ac80 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1ac90 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1aca0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1acb0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1acc0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1acd0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1ace0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1acf0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1ad00 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1ad10 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1ad20 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1ad30 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1ad40 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1ad50 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1ad60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ad70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1ad80 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1ad90 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1ada0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1adb0 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1adc0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1add0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1ade0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1adf0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1ae00 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1ae10 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1ae20 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1ae30 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1ae40 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1ae50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1ae60 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1ae70 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1ae80 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1ae90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1aea0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1aeb0 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1aec0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1aed0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1aee0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1aef0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1af00 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1af10 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1af20 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1af30 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1af40 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1af50 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1af60 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1af70 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1af80 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1af90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1afa0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1afb0 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1afc0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1afd0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1afe0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1aff0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1b000 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1b010 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1b020 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1b030 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1b040 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1b050 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1b060 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1b070 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1b080 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1b090 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1b0a0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1b0b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1b0c0 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1b0d0 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1b0e0 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1b0f0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1b100 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1b110 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1b120 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1b130 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1b140 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1b150 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1b160 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1b170 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1b180 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1b190 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1b1a0 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1b1b0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1b1c0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1b1d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1b1e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1b1f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b200 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1b210 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1b220 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b230 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1b240 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1b250 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1b260 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1b270 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1b280 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1b290 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1b2a0 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1b2b0 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1b2c0 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1b2d0 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1b2e0 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1b2f0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1b300 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1b310 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1b320 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1b330 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1b340 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1b350 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1b360 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1b370 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1b380 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1b390 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1b3a0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1b3b0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1b3c0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1b3d0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1b3e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1b3f0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1b400 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1b410 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1b420 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1b430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b440 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b450 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1b460 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1b470 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1b480 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1b490 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1b4a0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1b4b0 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1b4c0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1b4d0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1b4e0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1b4f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1b500 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1b510 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1b520 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1b530 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1b540 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1b550 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1b560 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1b570 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1b580 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1b590 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b5a0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1b5b0 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1b5c0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1b5d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1b5e0 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1b5f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b600 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1b610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1b620 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1b630 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1b640 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
1b650 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
1b660 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
1b670 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1b680 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b690 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1b6a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b6b0 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
1b6c0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1b6d0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1b6e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1b6f0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1b700 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b710 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1b720 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1b730 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1b740 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1b760 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1b770 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1b780 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1b790 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b7a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b7b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b7c0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
1b7d0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
1b7e0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
1b7f0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
1b800 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
1b810 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
1b820 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1b830 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
1b840 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1b850 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
1b860 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
1b870 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
1b880 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1b890 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1b8a0 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
1b8b0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
1b8c0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1b8d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b8e0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1b8f0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1b900 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
1b910 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
1b920 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
1b930 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
1b940 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
1b950 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
1b960 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
1b970 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
1b980 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
1b990 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
1b9a0 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
1b9b0 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
1b9c0 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
1b9d0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
1b9e0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1b9f0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
1ba00 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
1ba10 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
1ba20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1ba30 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1ba40 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1ba50 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
1ba60 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
1ba70 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72  f( pBtree==0 ) r
1ba80 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1ba90 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1baa0 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  e);.  for(p=pBtr
1bab0 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1bac0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1bad0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1bae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1baf0 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
1bb00 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
1bb10 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
1bb20 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
1bb30 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Code;.    for(i=
1bb40 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1bb50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1bb60 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
1bb70 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e[i]);.      p->
1bb80 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
1bb90 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1bba0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1bbb0 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
1bbc0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
1bbd0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1bbe0 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
1bbf0 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
1bc00 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
1bc10 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
1bc20 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
1bc30 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
1bc40 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
1bc50 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
1bc60 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
1bc70 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
1bc80 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
1bc90 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1bca0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1bcb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bcc0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1bcd0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1bce0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1bcf0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1bd00 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1bd10 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
1bd20 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
1bd30 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
1bd40 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1bd50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1bd60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1bd70 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  e1;..  sqlite3Bt
1bd80 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
1bd90 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
1bda0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1bdb0 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
1bdc0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1bdd0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
1bde0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1bdf0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1be00 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20  tripCode ){.    
1be10 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1be20 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
1be30 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62  ipCode);.  }.  b
1be40 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1be50 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
1be60 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1be70 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1be80 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
1be90 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
1bea0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
1beb0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
1bec0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1bed0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1bee0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1bef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1bf00 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
1bf10 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
1bf20 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
1bf30 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
1bf40 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
1bf50 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
1bf60 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
1bf70 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
1bf80 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1bf90 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1bfa0 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
1bfb0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
1bfc0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
1bfd0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
1bfe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bff0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
1c000 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1c010 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1c020 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
1c030 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1c040 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
1c050 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1c060 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1c070 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1c080 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
1c090 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
1c0a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1c0b0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1c0c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1c0d0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
1c0e0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
1c0f0 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
1c100 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
1c110 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1c120 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
1c130 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
1c140 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
1c150 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1c160 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1c170 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1c180 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c190 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
1c1a0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
1c1b0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1c1c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
1c1d0 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
1c1e0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
1c1f0 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
1c200 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
1c210 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
1c220 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
1c230 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
1c240 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
1c250 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
1c260 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
1c270 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
1c280 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
1c290 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
1c2a0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
1c2b0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
1c2c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
1c2d0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
1c2e0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
1c2f0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
1c300 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
1c310 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
1c320 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
1c330 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
1c340 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
1c350 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
1c360 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
1c370 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
1c380 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
1c390 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
1c3a0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
1c3b0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
1c3c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1c3d0 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
1c3e0 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
1c3f0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1c400 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
1c410 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
1c420 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
1c430 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
1c440 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
1c450 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
1c460 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
1c470 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
1c480 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1c490 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
1c4a0 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
1c4b0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1c4c0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
1c4d0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
1c4e0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
1c4f0 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
1c500 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
1c510 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
1c520 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
1c530 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
1c540 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
1c550 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1c560 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
1c570 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1c580 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
1c590 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
1c5a0 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
1c5b0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1c5c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1c5d0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
1c5e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1c5f0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
1c600 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1c610 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
1c620 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1c630 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
1c640 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1c650 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1c660 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
1c670 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1c680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1c690 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c6a0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1c6b0 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
1c6c0 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
1c6d0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1c6e0 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
1c6f0 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
1c700 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
1c710 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
1c720 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
1c730 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
1c740 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
1c750 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
1c760 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
1c770 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
1c780 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
1c790 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
1c7a0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1c7b0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
1c7c0 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
1c7d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1c7e0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1c7f0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
1c800 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
1c810 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1c820 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c830 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1c840 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1c850 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
1c860 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
1c870 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
1c880 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
1c890 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
1c8a0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
1c8b0 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
1c8c0 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
1c8d0 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
1c8e0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
1c8f0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
1c900 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
1c910 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
1c920 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
1c930 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
1c940 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1c950 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
1c960 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
1c970 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
1c980 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
1c990 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
1c9a0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1c9b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1c9c0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1c9d0 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
1c9e0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
1c9f0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
1ca00 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
1ca10 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
1ca20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
1ca30 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
1ca40 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1ca50 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
1ca60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ca70 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
1ca80 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1ca90 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1caa0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1cab0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
1cac0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1cad0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1cae0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1caf0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1cb00 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
1cb10 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
1cb20 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1cb30 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1cb40 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
1cb50 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
1cb60 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
1cb70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
1cb80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1cb90 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
1cba0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1cbb0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1cbc0 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
1cbd0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1cbe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cbf0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
1cc00 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
1cc10 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
1cc20 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
1cc30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
1cc40 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1cc50 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1cc60 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1cc70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1cc80 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1cc90 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
1cca0 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
1ccb0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1ccc0 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
1ccd0 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
1cce0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
1ccf0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
1cd00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1cd10 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
1cd20 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
1cd30 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
1cd40 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
1cd50 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
1cd60 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
1cd70 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
1cd80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1cd90 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1cda0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cdb0 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
1cdc0 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
1cdd0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
1cde0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
1cdf0 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
1ce00 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
1ce10 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
1ce20 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
1ce30 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
1ce40 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
1ce50 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1ce60 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
1ce70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ce80 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
1ce90 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
1cea0 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
1ceb0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1cec0 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
1ced0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1cee0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1cef0 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
1cf00 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
1cf10 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
1cf20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
1cf30 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
1cf40 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1cf50 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
1cf60 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
1cf70 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
1cf80 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
1cf90 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
1cfa0 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
1cfb0 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
1cfc0 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
1cfd0 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
1cfe0 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
1cff0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
1d000 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
1d010 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1d020 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
1d030 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
1d040 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1d050 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
1d060 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
1d070 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
1d080 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
1d090 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
1d0a0 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
1d0b0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
1d0c0 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
1d0d0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
1d0e0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
1d0f0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
1d100 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
1d110 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
1d120 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
1d130 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
1d140 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
1d150 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
1d160 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1d170 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1d180 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
1d190 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
1d1a0 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
1d1b0 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
1d1c0 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
1d1d0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
1d1e0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1d1f0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
1d200 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
1d210 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
1d220 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
1d230 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
1d240 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
1d250 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
1d260 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
1d270 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
1d280 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
1d290 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
1d2a0 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
1d2b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1d2c0 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
1d2d0 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
1d2e0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
1d2f0 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
1d300 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1d310 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1d320 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1d330 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1d340 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1d370 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1d3a0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1d3b0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1d3c0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1d3f0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1d400 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1d410 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1d420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d430 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
1d440 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1d450 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1d460 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1d470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d480 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
1d490 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
1d4a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1d4b0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1d4c0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
1d4d0 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20  ree handle */.. 
1d4e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d4f0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1d500 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1d510 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
1d520 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  lag==1 );..  /* 
1d530 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1d540 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1d550 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
1d560 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
1d570 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
1d580 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
1d590 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
1d5a0 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
1d5b0 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
1d5c0 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
1d5d0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1d5e0 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
1d5f0 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
1d600 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
1d610 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
1d620 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
1d630 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1d640 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
1d650 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
1d660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1d670 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
1d680 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
1d690 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
1d6a0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
1d6b0 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
1d6c0 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
1d6d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
1d6e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1d6f0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1d700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1d710 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
1d720 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1d730 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1d740 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
1d750 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1d760 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1d770 28 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d  (wrFlag && (pBt-
1d780 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1d790 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29  READ_ONLY)!=0) )
1d7a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d7b0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1d7c0 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
1d7d0 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
1d7e0 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
1d7f0 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
1d800 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
1d810 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
1d820 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
1d830 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
1d840 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
1d850 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
1d860 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
1d870 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
1d880 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
1d890 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
1d8a0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
1d8b0 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
1d8c0 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
1d8d0 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
1d8e0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1d8f0 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
1d900 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
1d910 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
1d920 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75  Cur->wrFlag = (u
1d930 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  8)wrFlag;.  pCur
1d940 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1d950 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
1d960 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1d970 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1d980 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
1d990 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1d9a0 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
1d9b0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1d9c0 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e  NVALID;.  pCur->
1d9d0 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b  cachedRowid = 0;
1d9e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d9f0 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
1da00 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
1da10 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da40 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1da50 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1da80 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1da90 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1daa0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1dad0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1dae0 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1daf0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1db00 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1db10 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1db20 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
1db30 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
1db40 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
1db70 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
1db80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1db90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1dba0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
1dbb0 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
1dbc0 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
1dbd0 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
1dbe0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1dbf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1dc00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1dc10 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
1dc20 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
1dc30 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
1dc40 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
1dc50 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
1dc60 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
1dc70 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
1dc80 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
1dc90 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
1dca0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
1dcb0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
1dcc0 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
1dcd0 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
1dce0 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
1dcf0 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
1dd00 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
1dd10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1dd20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1dd30 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
1dd40 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
1dd50 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
1dd60 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
1dd70 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
1dd80 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
1dd90 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
1dda0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
1ddb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
1ddc0 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
1ddd0 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
1dde0 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
1ddf0 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
1de00 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
1de10 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
1de20 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
1de30 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
1de40 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
1de50 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
1de60 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
1de70 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
1de80 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
1de90 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
1dea0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
1deb0 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
1dec0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1ded0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
1dee0 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
1def0 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
1df00 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
1df10 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
1df20 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
1df30 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
1df40 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
1df50 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1df60 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
1df70 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
1df80 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
1df90 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
1dfa0 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
1dfb0 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
1dfc0 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
1dfd0 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
1dfe0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
1dff0 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
1e000 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
1e010 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1e020 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
1e030 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
1e040 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
1e050 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
1e060 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
1e070 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
1e080 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
1e090 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
1e0a0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
1e0b0 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
1e0c0 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
1e0d0 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
1e0e0 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
1e0f0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
1e100 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
1e110 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
1e120 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1e130 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
1e140 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
1e150 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
1e160 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
1e170 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
1e180 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1e190 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
1e1a0 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
1e1b0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
1e1c0 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
1e1d0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1e1e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1e1f0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
1e200 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
1e210 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
1e220 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
1e230 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
1e240 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
1e250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e260 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
1e270 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
1e280 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
1e290 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
1e2a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
1e2b0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1e2c0 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
1e2d0 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
1e2e0 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
1e2f0 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
1e300 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
1e310 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
1e320 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
1e330 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1e340 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
1e350 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
1e360 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1e370 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1e380 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
1e390 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
1e3a0 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
1e3b0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
1e3c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e3d0 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
1e3e0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
1e3f0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
1e400 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e410 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
1e420 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1e430 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1e440 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1e450 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1e460 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e470 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e480 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
1e490 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e4a0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
1e4b0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1e4c0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
1e4d0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
1e4e0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1e4f0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
1e500 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1e510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
1e520 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1e530 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1e540 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
1e550 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
1e560 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1e570 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
1e580 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1e590 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1e5a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1e5b0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1e5c0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1e5d0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1e5e0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1e5f0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
1e600 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
1e610 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1e620 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
1e630 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e640 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1e650 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1e660 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e670 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1e680 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1e690 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1e6a0 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1e6b0 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1e6c0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1e6d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1e6e0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
1e6f0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1e700 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1e710 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1e720 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1e730 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1e740 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1e750 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1e760 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1e770 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1e780 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
1e790 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1e7a0 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1e7b0 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1e7c0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1e7d0 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1e7e0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1e7f0 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1e800 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1e810 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1e820 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1e830 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1e840 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1e850 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1e860 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1e870 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1e880 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1e890 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1e8a0 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1e8b0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1e8c0 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
1e8d0 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
1e8e0 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
1e8f0 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
1e900 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
1e910 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
1e920 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
1e930 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
1e940 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
1e950 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
1e960 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1e970 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
1e980 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
1e990 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1e9a0 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
1e9b0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
1e9c0 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
1e9d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1e9e0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1e9f0 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1ea00 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1ea10 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1ea20 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1ea30 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1ea40 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1ea50 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1ea60 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1ea70 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1ea80 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1ea90 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1eaa0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1eab0 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1eac0 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1ead0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1eae0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1eaf0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1eb00 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1eb10 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1eb20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1eb30 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1eb40 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1eb50 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1eb60 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1eb70 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1eb80 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
1eb90 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
1eba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ebb0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1ebc0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1ebd0 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1ebe0 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1ebf0 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1ec00 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1ec10 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1ec20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1ec30 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1ec40 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1ec90 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1eca0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1ece0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1ecf0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1ed30 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1ed40 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1ed50 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1ed60 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1ed70 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61  ; \.    pCur->va
1ed80 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1ee20 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1ee70 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1ee80 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1ee90 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1eea0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1eeb0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1eec0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1eed0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1eee0 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1eef0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1ef00 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1ef10 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1ef20 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1ef30 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1ef40 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1ef50 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1ef60 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1ef70 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1ef80 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1ef90 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1efa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1efb0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1efc0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1efd0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1efe0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1eff0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
1f000 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
1f010 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
1f020 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1f030 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1f040 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1f050 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1f060 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1f070 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1f080 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1f090 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1f0a0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1f0b0 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1f0c0 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1f0d0 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1f0e0 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1f0f0 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1f100 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1f110 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1f120 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1f130 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1f140 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1f150 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
1f160 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
1f170 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1f180 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
1f190 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1f1a0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
1f1b0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1f1c0 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
1f1d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1f1e0 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
1f1f0 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
1f200 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1f210 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f220 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1f230 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f240 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
1f250 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
1f260 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1f270 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1f280 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
1f290 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
1f2a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1f2b0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1f2c0 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
1f2d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1f2e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1f2f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f300 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1f310 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1f320 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1f330 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1f340 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1f350 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
1f360 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1f370 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
1f380 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
1f390 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
1f3a0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
1f3b0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
1f3c0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
1f3d0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
1f3e0 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
1f3f0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1f400 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
1f410 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
1f420 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
1f430 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1f440 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1f450 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1f460 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
1f470 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
1f480 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
1f490 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
1f4a0 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
1f4b0 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
1f4c0 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
1f4d0 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
1f4e0 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
1f4f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f500 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1f510 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1f520 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1f530 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f540 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1f550 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1f560 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1f570 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1f580 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
1f590 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
1f5a0 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ata;.  return SQ
1f5b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f5c0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1f5d0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1f5e0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1f5f0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1f600 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1f610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1f620 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1f630 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1f640 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1f650 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1f660 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1f670 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1f680 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1f690 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1f6a0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1f6b0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1f6c0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1f6d0 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1f6e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1f6f0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1f700 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1f710 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1f720 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1f730 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f740 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1f750 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1f760 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1f770 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1f780 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1f790 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1f7a0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1f7b0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1f7c0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1f7d0 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1f7e0 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1f7f0 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1f800 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1f810 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1f820 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1f830 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1f840 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1f850 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1f860 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1f870 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1f880 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1f890 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1f8a0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1f8b0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1f8c0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1f8d0 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1f8e0 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1f8f0 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1f900 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1f910 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1f920 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1f930 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1f940 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1f950 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1f960 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1f970 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1f980 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1f990 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1f9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f9b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1f9c0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1f9f0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1fa00 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1fa10 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1fa20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1fa30 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1fa40 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1fa50 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1fa60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1fa70 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1fa80 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1fa90 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1faa0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1fab0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1fac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1fad0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fae0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1faf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1fb00 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1fb10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fb20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fb30 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1fb40 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1fb50 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1fb60 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1fb70 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1fb80 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1fb90 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1fba0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1fbb0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1fbc0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1fbd0 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1fbe0 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1fbf0 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1fc00 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1fc10 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1fc20 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1fc30 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1fc40 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1fc50 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1fc60 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1fc70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1fc80 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1fc90 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1fca0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1fcb0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1fcc0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1fcd0 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1fce0 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1fcf0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fd00 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1fd10 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1fd20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
1fd30 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1fd40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1fd50 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1fd60 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1fd70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1fd80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1fd90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1fda0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1fdb0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1fdc0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1fdd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1fde0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1fdf0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1fe00 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
1fe10 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
1fe20 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
1fe30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fe40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1fe50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
1fe60 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
1fe70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
1fe80 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
1fe90 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1fea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1feb0 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1fec0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1fee0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1fef0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1ff00 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1ff10 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1ff20 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1ff30 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1ff40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1ff50 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1ff60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1ff70 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1ff80 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1ff90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1ffa0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1ffb0 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1ffc0 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1ffd0 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1ffe0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1fff0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
20000 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
20010 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
20020 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
20030 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
20040 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
20050 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
20060 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
20070 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
20080 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
20090 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
200a0 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
200b0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
200c0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
200d0 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
200e0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
200f0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
20100 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
20110 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
20120 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
20130 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
20140 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
20150 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
20160 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
20170 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
20180 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
20190 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
201a0 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
201b0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
201c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
201d0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
201e0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20200 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
20210 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
20220 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
20230 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
20240 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
20250 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
20260 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
20270 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
20280 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
20290 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
202a0 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
202b0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
202c0 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
202d0 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
202e0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
202f0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20300 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
20310 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20330 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20340 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
20350 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
20360 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
20370 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
20380 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
20390 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
203a0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
203b0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
203c0 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
203d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
203e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
203f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20400 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
20410 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
20420 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
20430 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
20440 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
20450 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
20460 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
20470 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
20480 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
20490 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
204a0 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
204b0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
204c0 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
204d0 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
204e0 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
204f0 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
20500 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
20510 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
20520 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
20530 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
20540 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
20550 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
20560 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
20570 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
20580 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
20590 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
205a0 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
205b0 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
205c0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
205d0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
205e0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
205f0 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
20600 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
20610 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
20620 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
20630 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
20640 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
20650 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
20660 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
20670 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
20680 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
20690 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
206a0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
206b0 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
206c0 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
206d0 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
206e0 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
206f0 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
20700 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
20710 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
20720 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
20730 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
20740 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
20750 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
20760 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
20770 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
20780 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
20790 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
207a0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
207b0 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
207c0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
207d0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
207e0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
207f0 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
20800 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
20810 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
20820 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
20830 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
20840 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
20850 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
20860 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
20870 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
20880 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
20890 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
208a0 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
208b0 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
208c0 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
208d0 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
208e0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
208f0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
20900 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
20910 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
20920 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
20930 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
20940 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
20950 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
20960 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
20970 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
20980 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
20990 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
209a0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
209b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
209c0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
209d0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
209e0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
209f0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
20a00 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
20a10 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
20a20 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
20a30 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
20a40 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
20a50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
20a60 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
20a70 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
20a80 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
20a90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20aa0 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
20ab0 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
20ac0 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
20ad0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
20ae0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
20af0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
20b00 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
20b10 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
20b20 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
20b30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
20b40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20b50 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
20b60 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20b70 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
20b80 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
20b90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20ba0 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
20bb0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
20bc0 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
20bd0 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
20be0 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
20bf0 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
20c00 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
20c10 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
20c20 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
20c30 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61  ( NEVER(offset+a
20c40 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
20c50 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20  info.nData) .   
20c60 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  || &aPayload[pCu
20c70 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
20c80 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
20c90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
20ca0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  .  ){.    /* Try
20cb0 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
20cc0 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
20cd0 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
20ce0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
20cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20d00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
20d10 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
20d20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
20d30 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
20d40 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
20d50 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
20d60 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
20d70 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
20d80 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
20d90 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
20da0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20db0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
20dc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20dd0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
20de0 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
20df0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
20e00 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
20e10 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
20e20 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
20e30 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
20e40 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
20e50 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
20e60 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
20e70 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
20e80 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
20e90 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
20ea0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
20eb0 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
20ec0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
20ed0 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
20ee0 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
20ef0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
20f00 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
20f10 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
20f20 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
20f30 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
20f40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20f50 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
20f60 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
20f70 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
20f80 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
20f90 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
20fa0 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
20fb0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
20fc0 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
20fd0 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
20fe0 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
20ff0 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
21000 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
21010 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
21020 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
21030 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
21040 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
21050 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
21060 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
21070 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
21080 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
21090 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
210a0 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
210b0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
210c0 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
210d0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
210e0 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
210f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
21100 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
21110 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
21120 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
21130 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
21140 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
21150 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
21160 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
21170 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
21180 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
21190 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
211a0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
211b0 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
211c0 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77   /* nOvfl is alw
211d0 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49  ays positive.  I
211e0 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20  f it were zero, 
211f0 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75  fetchPayload wou
21200 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  ld have.      **
21210 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65   been used inste
21220 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ad of this routi
21230 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ne. */.      if(
21240 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26   ALWAYS(nOvfl) &
21250 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
21260 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
21270 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21290 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
212a0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
212b0 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
212c0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
212d0 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
212e0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
212f0 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
21300 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
21310 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
21320 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
21330 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
21340 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
21350 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
21360 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
21370 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
21380 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
21390 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
213a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
213b0 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
213c0 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
213d0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
213e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
213f0 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
21400 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
21410 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
21420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21430 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
21440 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
21450 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
21460 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
21470 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
21480 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
21490 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
214a0 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
214b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
214c0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
214d0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
214e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
214f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
21500 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
21510 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
21520 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
21530 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
21540 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
21550 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
21560 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
21570 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
21580 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
21590 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
215a0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
215b0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
215c0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
215d0 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
215e0 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
215f0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
21600 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
21610 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
21620 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
21630 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
21640 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
21650 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
21660 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
21670 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
21680 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
21690 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
216a0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
216b0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
216c0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
216d0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
216e0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
216f0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
21700 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
21710 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
21720 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
21730 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
21740 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
21750 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
21760 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
21770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21780 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
21790 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
217a0 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
217b0 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
217c0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
217d0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
217e0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
217f0 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
21800 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
21810 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21820 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
21830 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
21840 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
21850 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
21860 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
21870 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
21880 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
21890 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
218a0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
218b0 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
218c0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
218d0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
218e0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
218f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21900 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
21910 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
21920 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
21930 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
21940 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
21950 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
21960 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
21970 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
21980 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
21990 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
219a0 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
219b0 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
219c0 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
219d0 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
219e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
219f0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
21a00 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
21a10 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
21a20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
21a30 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
21a40 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
21a50 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
21a60 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
21a70 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
21a80 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
21a90 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
21aa0 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
21ab0 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
21ac0 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
21ad0 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
21ae0 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
21af0 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
21b00 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
21b10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21b20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( eOp==0      
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
21b60 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
21b70 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ba0 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
21bb0 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
21bc0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21bd0 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
21be0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20           /* (4) 
21bf0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
21c00 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
21c10 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
21c20 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
21c30 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
21c40 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61       && pBt->pPa
21c50 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d  ge1->aData[19]==
21c60 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20  0x01            
21c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35             /* (5
21c80 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
21c90 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
21ca0 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
21cb0 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
21cc0 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
21cd0 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
21ce0 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
21cf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21d00 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
21d10 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
21d20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
21d30 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
21d40 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
21d50 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
21d60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
21d70 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
21d80 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
21d90 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
21da0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
21db0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
21dc0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
21dd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
21de0 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
21df0 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
21e00 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
21e10 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50       (eOp==0 ? P
21e20 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
21e30 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  Y : 0).         
21e40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
21e50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
21e70 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
21e80 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
21e90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
21ea0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
21eb0 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
21ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
21ed0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
21ee0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
21ef0 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  +4], pBuf, a, eO
21f00 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  p, pDbPage);.   
21f10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21f20 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
21f30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
21f40 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
21f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21f60 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
21f70 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
21f80 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
21f90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
21fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21fb0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
21fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
21fd0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
21fe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21ff0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
22000 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
22010 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
22020 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
22030 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
22040 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
22050 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
22060 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
22070 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
22080 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  t"..**.** The ca
22090 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
220a0 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
220b0 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
220c0 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20  d row.** in the 
220d0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
220e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
220f0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
22100 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
22110 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
22120 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
22130 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
22140 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
22150 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
22160 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
22170 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
22180 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
22190 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
221a0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
221b0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
221c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
221d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
221e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
221f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22200 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
22210 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
22220 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
22230 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
22240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22250 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22260 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
22270 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
22280 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
22290 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
222a0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
222b0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
222c0 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
222d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
222e0 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
222f0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
22300 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
22310 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
22320 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
22330 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
22340 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
22350 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
22360 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
22370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
22380 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
22390 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
223a0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
223b0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
223c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
223d0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
223e0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
223f0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
22400 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
22410 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
22420 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
22430 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
22440 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
22450 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20  nt rc;..#ifndef 
22460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
22470 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72  BLOB.  if ( pCur
22480 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22490 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
224a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
224b0 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ORT;.  }.#endif.
224c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
224d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
224e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
224f0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
22500 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
22510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22520 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22530 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22540 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
22550 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
22560 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
22570 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22580 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
22590 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
225a0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
225b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
225c0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
225d0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
225e0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
225f0 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
22600 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22610 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
22620 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22630 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
22640 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
22650 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
22660 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
22670 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
22680 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
22690 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
226a0 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b  ** the key if sk
226b0 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20  ipKey==0 and it 
226c0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65  points to the be
226d0 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
226e0 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31  if.** skipKey==1
226f0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
22700 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
22710 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20  ble key/data is 
22720 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
22730 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
22740 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
22750 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  lue returned wil
22760 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61  l not be.** a va
22770 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
22780 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22790 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
227a0 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
227b0 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
227c0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
227d0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
227e0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
227f0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
22800 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
22810 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
22820 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
22830 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
22840 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
22850 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
22860 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
22870 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
22880 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
22890 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
228a0 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
228b0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
228c0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
228d0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
228e0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
228f0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
22900 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
22910 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
22920 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
22930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
22940 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
22950 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
22960 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
22970 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
22980 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
22990 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
229a0 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
229b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
229c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
229d0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
229e0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
229f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
22a00 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
22a10 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
22a20 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
22a30 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 2c 20  */.  u32 *pAmt, 
22a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
22a50 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
22a60 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
22a70 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
22a80 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
22a90 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
22aa0 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
22ab0 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
22ac0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
22ad0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
22ae0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
22af0 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e  32 nKey;.  u32 n
22b00 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
22b10 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
22b20 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
22b30 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22b40 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
22b50 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
22b60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
22b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
22b80 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22b90 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ur) );.  pPage =
22ba0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22bb0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
22bc0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
22bd0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
22be0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
22bf0 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
22c00 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20  >info.nSize==0) 
22c10 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  ){.    btreePars
22c20 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
22c30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c  ge[pCur->iPage],
22c40 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22c50 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20  r->iPage],.     
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
22c70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a  Cur->info);.  }.
22c80 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
22c90 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
22ca0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
22cb0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
22cc0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
22cd0 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
22ce0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22cf0 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70     nKey = (int)p
22d00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
22d10 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
22d20 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
22d30 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
22d40 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
22d50 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
22d60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
22d70 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
22d80 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61  fo.nLocal;.    a
22d90 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e  ssert( nLocal<=n
22da0 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41  Key );.  }.  *pA
22db0 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
22dc0 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
22dd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
22de0 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
22df0 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
22e00 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
22e10 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
22e20 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
22e30 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
22e40 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
22e50 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
22e60 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
22e70 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
22e80 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
22e90 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
22ea0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
22eb0 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
22ec0 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
22ed0 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
22ee0 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
22ef0 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
22f00 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
22f10 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
22f20 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
22f30 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
22f40 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
22f50 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
22f60 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
22f70 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
22f80 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
22f90 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
22fa0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
22fb0 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
22fc0 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
22fd0 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
22fe0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
22ff0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
23000 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
23010 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
23020 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
23030 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
23040 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
23050 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  t){.  const void
23060 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   *p = 0;.  asser
23070 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23080 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
23090 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
230a0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
230b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
230c0 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  r) );.  if( ALWA
230d0 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  YS(pCur->eState=
230e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
230f0 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74  {.    p = (const
23100 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
23110 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
23120 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
23130 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64   p;.}.const void
23140 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
23150 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
23160 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
23170 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  t){.  const void
23180 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   *p = 0;.  asser
23190 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
231a0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
231b0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
231c0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
231d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
231e0 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  r) );.  if( ALWA
231f0 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  YS(pCur->eState=
23200 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
23210 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74  {.    p = (const
23220 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
23230 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
23240 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
23250 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   p;.}.../*.** Mo
23260 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
23270 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
23280 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
23290 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
232a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
232b0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
232c0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
232d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
232e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
232f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
23300 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
23310 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
23320 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
23330 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
23340 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
23350 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
23360 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
23370 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
23380 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
23390 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
233a0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
233b0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
233c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
233d0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
233e0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
233f0 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
23400 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d  .  int i = pCur-
23410 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  >iPage;.  MemPag
23420 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42  e *pNewPage;.  B
23430 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23440 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
23450 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23460 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23470 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23480 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23490 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
234a0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
234b0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
234c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
234d0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
234e0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
234f0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
23500 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
23510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23520 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
23530 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
23540 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
23550 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20  no, &pNewPage,. 
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23570 75 72 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 3f 20  ur->wrFlag==0 ? 
23580 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
23590 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72  LY : 0);.  if( r
235a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
235b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
235c0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
235d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
235e0 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
235f0 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
23600 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23610 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
23620 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ey = 0;.  if( pN
23630 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
23640 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74  || pNewPage->int
23650 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67  Key!=pCur->apPag
23660 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[i]->intKey ){.
23670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23680 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23690 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
236a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30  ITE_OK;.}..#if 0
236b0 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
236c0 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
236d0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
236e0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
236f0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
23700 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
23710 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
23720 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
23730 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
23740 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
23750 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
23760 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
23770 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23780 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
23790 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
237a0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
237b0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
237c0 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
237d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
237e0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
237f0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
23800 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
23810 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
23820 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
23830 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
23840 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
23850 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
23860 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
23870 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
23880 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
23890 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
238a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
238b0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
238c0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
238d0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
238e0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
238f0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
23900 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
23910 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
23920 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
23930 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
23940 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
23950 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
23960 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
23970 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
23980 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
23990 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
239a0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
239b0 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
239c0 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
239d0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
239e0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
239f0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
23a00 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
23a10 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
23a20 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
23a30 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
23a40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
23a50 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
23a60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23a70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23a80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23a90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23aa0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
23ab0 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
23ac0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23ad0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
23ae0 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49  ..  /* UPDATE: I
23af0 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f  t is actually po
23b00 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63  ssible for the c
23b10 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20  ondition tested 
23b20 62 79 20 74 68 65 20 61 73 73 65 72 74 0a 20 20  by the assert.  
23b30 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75  ** below to be u
23b40 6e 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74  ntrue if the dat
23b50 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
23b60 72 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20  rrupt. This can 
23b70 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e  occur if.  ** on
23b80 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64  e cursor has mod
23b90 69 66 69 65 64 20 70 61 67 65 20 70 50 61 72 65  ified page pPare
23ba0 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66 65 72  nt while a refer
23bb0 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68 65  ence to it is he
23bc0 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65  ld .  ** by a se
23bd0 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69  cond cursor. Whi
23be0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
23bf0 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  en if a single p
23c00 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20  age is linked.  
23c10 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ** into more tha
23c20 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
23c30 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72  ucture in a corr
23c40 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a  upt database.  *
23c50 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
23c60 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
23c70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23c80 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
23c90 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
23ca0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
23cb0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
23cc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
23cd0 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  gno.  );.#endif.
23ce0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
23cf0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23d00 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
23d10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23d20 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  e-1]->nCell );..
23d30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
23d40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23d50 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
23d60 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
23d70 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
23d80 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
23d90 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  NKey = 0;.}../*.
23da0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
23db0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
23dc0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
23dd0 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
23de0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
23df0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
23e00 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
23e10 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
23e20 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
23e30 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
23e40 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
23e50 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
23e60 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
23e70 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
23e80 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
23e90 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
23ea0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
23eb0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
23ec0 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
23ed0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
23ee0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
23ef0 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
23f00 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
23f10 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
23f20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
23f30 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
23f40 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
23f50 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
23f60 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
23f70 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
23f80 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
23f90 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
23fa0 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
23fb0 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
23fc0 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
23fd0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
23fe0 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
23ff0 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
24000 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
24010 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
24020 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
24030 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
24040 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
24050 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
24060 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
24070 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
24080 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
24090 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
240a0 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
240b0 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
240c0 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
240d0 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
240e0 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
240f0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
24100 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
24110 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
24120 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
24130 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
24140 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
24150 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
24160 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
24170 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
24180 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
24190 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
241a0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
241b0 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
241c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
241d0 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
241e0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
241f0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
24200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24210 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
24220 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
24230 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
24240 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
24250 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24260 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24270 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
24280 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
24290 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
242a0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
242b0 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
242c0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
242d0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
242e0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
242f0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
24300 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
24310 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
24320 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
24330 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24340 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
24350 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24360 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
24370 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
24380 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
24390 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
243a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
243b0 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
243c0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
243d0 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
243e0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
243f0 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =1; i<=pCur->iPa
24400 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
24410 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
24420 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
24430 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
24440 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
24450 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
24460 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
24470 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
24480 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
24490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
244a0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
244b0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
244c0 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
244d0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
244e0 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24500 20 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 3d     pCur->wrFlag=
24510 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
24520 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
24530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
24550 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24560 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
24570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24580 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
24590 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ge = 0;..    /* 
245a0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
245b0 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
245c0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
245d0 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
245e0 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78  cursor.    ** ex
245f0 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
24600 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
24610 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
24620 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
24630 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65      ** NULL, the
24640 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
24650 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
24660 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
24670 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20  he case,.    ** 
24680 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
24690 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
246a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
246b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
246c0 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43  >intKey==1 || pC
246d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
246e0 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  ntKey==0 );.    
246f0 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49  if( (pCur->pKeyI
24700 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61  nfo==0)!=pCur->a
24710 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
24720 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24730 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24740 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
24750 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
24760 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
24770 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
24780 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73  t type. This mus
24790 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61  t be the.  ** ca
247a0 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74  se as the call t
247b0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
247c0 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20  that loaded the 
247d0 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65  root-page (eithe
247e0 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c  r.  ** this call
247f0 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20 69   or a previous i
24800 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64  nvocation) would
24810 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
24820 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20  orruption .  ** 
24830 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f  if the assumptio
24840 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
24850 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70   and it is not p
24860 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
24870 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65  flags .  ** byte
24880 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f   to have been mo
24890 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68 69  dified while thi
248a0 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64  s cursor is hold
248b0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a  ing a reference.
248c0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
248d0 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20  .  */.  pRoot = 
248e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
248f0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
24900 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
24910 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65  noRoot );.  asse
24920 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
24930 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79  t && (pCur->pKey
24940 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d  Info==0)==pRoot-
24950 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43  >intKey );..  pC
24960 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
24970 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
24980 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
24990 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
249a0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
249b0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
249c0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
249d0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
249e0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
249f0 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
24a00 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
24a10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24a20 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
24a30 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
24a40 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
24a50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
24a60 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
24a70 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
24a80 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
24a90 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
24aa0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
24ab0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
24ac0 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
24ad0 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
24ae0 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
24af0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24b00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
24b10 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
24b20 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
24b30 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
24b40 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
24b50 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
24b60 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
24b70 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
24b80 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
24b90 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
24ba0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
24bb0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
24bc0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
24bd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
24be0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
24bf0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24c00 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
24c10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24c20 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
24c30 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
24c40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24c50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24c60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24c70 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24c80 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
24c90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
24ca0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
24cb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24cc0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
24cd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
24ce0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
24cf0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
24d00 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
24d10 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
24d20 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
24d30 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
24d40 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24d50 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
24d60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24d70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
24d80 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
24d90 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
24da0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
24db0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
24dc0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
24dd0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
24de0 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
24df0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
24e00 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
24e10 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
24e20 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
24e30 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
24e40 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
24e50 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
24e60 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
24e70 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
24e80 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
24e90 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
24ea0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
24eb0 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
24ec0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
24ed0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
24ee0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
24ef0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
24f00 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
24f10 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
24f20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
24f30 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
24f40 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24f50 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
24f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24f70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24f80 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
24f90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24fa0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24fb0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24fc0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24fd0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
24fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
24ff0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25000 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25010 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
25020 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
25030 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
25040 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
25050 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
25060 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25070 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
25080 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
25090 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
250a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
250b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
250c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
250d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
250e0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
250f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25100 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
25110 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
25120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25130 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
25140 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
25150 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
25160 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
25170 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
25180 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
25190 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
251a0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
251b0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
251c0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
251d0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
251e0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
251f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25200 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
25210 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
25220 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
25230 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25240 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
25260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25270 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
25280 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
25290 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
252a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
252b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
252c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
252d0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
252e0 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
252f0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
25300 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
25310 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25320 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
25330 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
25340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25350 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
25360 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25370 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
25380 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
25390 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
253a0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
253b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
253c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
253d0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
253e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
253f0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
25400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
25410 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
25420 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
25430 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
25440 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
25450 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
25460 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
25470 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
25480 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
25490 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
254a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
254b0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
254c0 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
254d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
254e0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
254f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25500 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
25510 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
25520 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
25530 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
25540 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
25550 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
25560 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
25570 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
25580 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
25590 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b   pCur->atLast ){
255a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
255b0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
255c0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
255d0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
255e0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
255f0 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
25600 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
25610 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
25620 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
25630 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
25640 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
25650 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
25660 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
25670 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
25680 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
25690 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
256a0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
256b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
256c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
256d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
256e0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
256f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25700 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
25710 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
25720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25730 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
25740 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
25750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25760 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
25770 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
25780 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
25790 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
257a0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
257b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
257c0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
257d0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
257e0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
257f0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
25800 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25810 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
25820 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
25830 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
25840 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
25850 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
25860 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49  tLast = rc==SQLI
25870 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20  TE_OK ?1:0;.    
25880 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
25890 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
258a0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
258b0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
258c0 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
258d0 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
258e0 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
258f0 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
25900 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
25910 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
25920 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
25930 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
25940 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
25950 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
25960 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
25970 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
25980 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
25990 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
259a0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
259b0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
259c0 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
259d0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
259e0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
259f0 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
25a00 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
25a10 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
25a20 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
25a30 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
25a40 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
25a50 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
25a60 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
25a70 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
25a80 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
25a90 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
25aa0 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
25ab0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
25ac0 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
25ad0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
25ae0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
25af0 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
25b00 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
25b10 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
25b20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
25b30 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
25b40 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
25b50 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
25b60 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
25b70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
25b80 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
25ba0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
25bb0 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
25bc0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
25bd0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
25be0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
25bf0 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
25c00 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
25c10 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
25c20 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
25c30 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
25c40 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
25c50 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
25c60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25c70 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
25c80 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
25c90 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
25ca0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
25cb0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
25cc0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
25cd0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
25cf0 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
25d00 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f  y/pIdxKey..**.*/
25d10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25d20 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
25d30 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
25d40 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
25d50 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
25d60 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
25d70 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
25d80 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
25d90 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
25da0 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
25db0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
25dc0 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
25dd0 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
25de0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
25df0 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
25e00 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
25e10 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
25e20 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
25e30 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
25e40 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
25e50 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
25e60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25e70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25e90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
25ea0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
25eb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25ec0 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
25ed0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
25ee0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
25ef0 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
25f00 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
25f10 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
25f20 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
25f30 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
25f40 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
25f50 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
25f60 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
25f70 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
25f80 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
25f90 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
25fa0 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65  & pCur->validNKe
25fb0 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61  y .   && pCur->a
25fc0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
25fd0 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
25fe0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
25ff0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
26000 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
26010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26020 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
26030 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26   pCur->atLast &&
26040 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
26050 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
26060 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
26070 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26080 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
26090 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
260a0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
260b0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
260c0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
260d0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
260e0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
260f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26110 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
26120 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
26130 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
26140 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
26150 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
26160 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
26170 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
26180 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
26190 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43  ll>0 );.  if( pC
261a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
261b0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
261c0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
261d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
261e0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
261f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26200 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
26210 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
26220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26230 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26240 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
26250 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
26260 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
26270 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
26280 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  , c;.    Pgno ch
26290 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
262a0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
262b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
262c0 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  age];.    u8 *pC
262d0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
26300 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
26310 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61  e */..    /* pPa
26320 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62  ge->nCell must b
26330 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
26340 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20  ero. If this is 
26350 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
26360 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
26370 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
26380 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e  INVALID above an
26390 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c  d this for(;;) l
263a0 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72  oop.    ** not r
263b0 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  un. If this is n
263c0 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ot the root-page
263d0 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54  , then the moveT
263e0 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65  oChild() routine
263f0 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61  .    ** would ha
26400 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  ve already detec
26410 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f  ted db corruptio
26420 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50  n. Similarly, pP
26430 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  age must.    ** 
26440 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e  be the right kin
26450 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  d (index or tabl
26460 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  e) of b-tree pag
26470 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  e. Otherwise.   
26480 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   ** a moveToChil
26490 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f  d() or moveToRoo
264a0 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68  t() call would h
264b0 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
264c0 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
264d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
264e0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61  nCell>0 );.    a
264f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
26500 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d  tKey==(pIdxKey==
26510 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20  0) );.    lwr = 
26520 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
26530 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
26540 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
26550 20 3f 20 75 70 72 20 3a 20 28 75 70 72 2b 6c 77   ? upr : (upr+lw
26560 72 29 2f 32 3b 0a 20 20 20 20 70 43 75 72 2d 3e  r)/2;.    pCur->
26570 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26580 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
26590 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
265a0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ize = 0;.    if(
265b0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
265c0 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
265d0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
265e0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
265f0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
26600 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
26610 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
26620 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
26630 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
26640 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
26650 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
26660 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
26670 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
26680 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
26690 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
266a0 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
266b0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
266c0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69   if( nCellKey==i
266d0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
266e0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
266f0 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ey = 1;.        
26700 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
26710 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
26720 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
26730 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
26740 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
26750 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
26760 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
26770 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
26780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
26790 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
267a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
267b0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
267c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
267d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
267e0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
267f0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
26800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
26810 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  se if( nCellKey<
26820 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
26830 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
26840 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26850 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26860 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
26870 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75  y );.          u
26880 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
26890 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
268a0 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
268b0 20 20 20 20 20 20 20 63 20 3d 20 6e 43 65 6c 6c         c = nCell
268c0 4b 65 79 3c 69 6e 74 4b 65 79 20 3f 20 2d 31 20  Key<intKey ? -1 
268d0 3a 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  : +1;.          
268e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
268f0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
26900 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 62  idx;.          b
26910 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
26920 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
26930 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 20  wr+upr)/2;.     
26940 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
26950 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
26960 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a       int nCell;.
26970 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
26980 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
26990 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
269a0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20  ildPtrSize;..   
269b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
269c0 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
269d0 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
269e0 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
269f0 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
26a00 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
26a10 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
26a20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
26a30 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
26a40 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
26a50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
26a60 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
26a70 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
26a80 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
26a90 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
26aa0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
26ab0 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
26ac0 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
26ad0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
26ae0 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
26af0 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
26b00 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
26b10 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
26b20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
26b30 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
26b40 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
26b50 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
26b60 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
26b70 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
26b80 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
26b90 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
26ba0 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
26bb0 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
26bc0 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
26bd0 6f 61 64 0a 20 20 20 20 20 20 20 20 20 2f 2a 20  oad.         /* 
26be0 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29  && (pCell+nCell)
26bf0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  <pPage->aDataEnd
26c00 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
26c10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
26c20 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
26c30 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
26c40 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
26c50 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
26c60 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
26c70 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
26c80 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
26c90 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
26ca0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
26cb0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
26cc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26cd0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
26ce0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
26cf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
26d00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
26d10 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
26d20 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
26d30 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
26d40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26d50 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
26d60 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
26d70 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
26d80 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
26d90 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
26da0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
26db0 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b     /* && (pCell+
26dc0 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67 65 2d  nCell+2)<=pPage-
26dd0 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20 20  >aDataEnd */.   
26de0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26df0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
26e00 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
26e10 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
26e20 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
26e30 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
26e40 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
26e50 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
26e60 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
26e70 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
26e80 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
26e90 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
26ea0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
26eb0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
26ec0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
26ed0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
26ee0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
26ef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
26f00 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
26f10 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
26f20 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
26f30 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
26f40 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
26f50 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
26f60 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
26f70 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
26f80 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
26f90 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
26fa0 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
26fb0 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
26fc0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
26fd0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
26fe0 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
26ff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
27000 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
27010 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
27020 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
27030 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
27040 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
27050 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
27060 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
27070 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
27080 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
27090 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
270a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
270b0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
270c0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
270d0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
270e0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
270f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
27100 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
27110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27120 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27130 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
27140 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
27150 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
27160 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
27170 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27180 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
27190 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
271a0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
271b0 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
271c0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
271d0 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  llKey, 0);.     
271e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
271f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27200 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
27210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
27220 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
27230 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
27240 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
27250 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
27260 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
27270 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
27280 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27290 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
272a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
272b0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
272c0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
272d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
272e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
272f0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
27300 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27310 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
27320 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
27330 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
27340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
27350 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
27360 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
27370 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27380 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
27390 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
273a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72  .        if( lwr
273b0 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >upr ){.        
273c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
273d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
273e0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
273f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
27400 7d 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  }.        idx = 
27410 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20  (lwr+upr)/2;.   
27420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
27430 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
27440 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
27450 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
27460 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
27470 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
27480 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
27490 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
274a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
274b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
274c0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
274d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
274e0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ell );.      *pR
274f0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
27500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27510 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27520 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 65 6c 73  finish;.    }els
27530 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
27540 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
27550 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
27560 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
27570 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
27580 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
27590 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
275a0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
275b0 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
275c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
275d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
275e0 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a  ge] = (u16)lwr;.
275f0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
27600 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
27610 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
27620 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
27630 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
27640 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
27650 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
27660 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
27670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
27680 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
27690 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
276a0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
276b0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
276c0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
276d0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
276e0 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
276f0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
27700 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
27710 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
27720 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
27730 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
27740 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
27750 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
27760 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
27770 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
27780 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
27790 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
277a0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
277b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
277c0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
277d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
277e0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
277f0 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
27800 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
27810 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
27820 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
27830 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
27840 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
27850 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
27860 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
27870 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
27880 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
27890 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
278a0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
278b0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
278c0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
278d0 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
278e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
278f0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
27900 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
27910 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
27920 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
27930 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
27940 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27950 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
27960 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
27970 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
27980 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
27990 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
279a0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
279b0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
279c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
279d0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
279e0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
279f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27a00 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
27a10 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
27a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27a30 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
27a40 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
27a50 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27a60 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
27a70 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
27a80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
27a90 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
27aa0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
27ab0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27ac0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
27ad0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
27ae0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
27af0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
27b00 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
27b10 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
27b20 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
27b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27b40 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
27b50 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
27b60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27b70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27b80 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
27b90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
27ba0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
27bb0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
27bc0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
27bd0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
27be0 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
27bf0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
27c00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70   = 0;.        *p
27c10 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
27c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27c30 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
27c40 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
27c50 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
27c60 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
27c70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27c80 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
27c90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27ca0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
27cb0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
27cc0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
27cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
27ce0 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
27cf0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
27d00 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
27d10 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
27d20 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
27d30 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
27d40 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
27d50 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
27d60 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
27d70 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
27d80 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
27d90 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
27da0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
27db0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
27dc0 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
27dd0 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
27de0 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
27df0 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
27e00 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
27e10 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
27e20 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
27e30 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
27e40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
27e50 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
27e60 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
27e70 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
27e80 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
27e90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
27ea0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
27eb0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
27ec0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
27ed0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
27ee0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
27ef0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
27f00 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27f10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
27f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
27f30 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
27f40 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  t(pCur);.      *
27f50 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
27f60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27f70 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
27f80 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
27f90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
27fa0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
27fb0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
27fc0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
27fd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
27fe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
27ff0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
28000 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
28010 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
28020 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28030 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
28040 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28050 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
28060 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
28070 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
28080 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
28090 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
280a0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
280b0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
280c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
280d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
280e0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
280f0 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
28100 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
28110 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
28120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28130 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
28140 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
28150 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
28160 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
28170 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
28180 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
28190 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
281a0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
281b0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
281c0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
281d0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
281e0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
281f0 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
28200 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
28210 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
28220 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
28230 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
28240 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
28250 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
28260 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
28270 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
28280 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
28290 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
282a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
282b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
282c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
282d0 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
282e0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
282f0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
28300 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
28310 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 61 74  ID );.  pCur->at
28320 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
28330 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
28340 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
28350 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
28360 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
28370 52 5f 52 45 51 55 49 52 45 53 45 45 4b 29 20 29  R_REQUIRESEEK) )
28380 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
28390 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
283a0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
283b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
283c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
283d0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
283e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
283f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28400 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
28410 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
28420 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
28430 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
28440 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
28460 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
28470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28480 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28490 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
284a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
284b0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
284c0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
284d0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
284e0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
284f0 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
28500 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
28510 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
28520 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
28530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28540 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
28550 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
28560 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
28570 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
28580 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28590 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
285a0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
285b0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
285c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
285d0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
285e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
285f0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
28600 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
28610 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
28620 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
28630 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
28640 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
28650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28660 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
28670 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
28680 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28690 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
286a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
286b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
286c0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
286d0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
286e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
286f0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
28700 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
28710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28720 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
28730 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
28740 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
28750 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
28760 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
28770 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
28780 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
28790 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
287a0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
287b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
287c0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
287d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
287e0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
287f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
28800 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
28810 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
28820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28830 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28840 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
28850 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
28860 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
28870 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
28880 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28890 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
288a0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
288b0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
288c0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
288d0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
288e0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
288f0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
28900 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
28910 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
28920 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
28930 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
28940 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
28950 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
28960 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
28970 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
28980 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
28990 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
289a0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
289b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
289c0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
289d0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
289e0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
289f0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
28a00 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
28a10 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
28a20 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
28a30 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
28a40 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
28a50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
28a60 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
28a70 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
28a80 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
28a90 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
28aa0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
28ab0 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
28ac0 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
28ad0 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
28ae0 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
28af0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
28b00 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
28b10 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
28b20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
28b30 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
28b40 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
28b50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
28b60 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
28b70 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
28b80 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
28b90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
28ba0 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
28bb0 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
28bc0 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
28bd0 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
28be0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
28bf0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
28c00 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
28c10 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
28c20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
28c30 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
28c40 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
28c50 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
28c60 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
28c70 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
28c80 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
28c90 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
28ca0 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
28cb0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
28cc0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
28cd0 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
28ce0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
28cf0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
28d00 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
28d10 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
28d20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
28d30 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
28d40 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
28d50 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
28d60 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
28d70 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
28d80 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
28d90 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
28da0 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
28db0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
28dc0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
28dd0 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
28de0 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
28df0 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
28e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
28e10 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
28e20 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
28e30 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
28e40 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
28e50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
28e60 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
28e70 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
28e80 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
28e90 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
28ea0 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
28eb0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
28ec0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
28ed0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
28ee0 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
28ef0 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
28f00 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
28f10 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
28f20 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
28f30 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
28f40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
28f50 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
28f60 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
28f70 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
28f80 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
28f90 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
28fa0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
28fb0 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
28fc0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
28fd0 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
28fe0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
28ff0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
29000 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
29010 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
29020 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
29030 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
29040 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29050 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29060 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
29070 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
29080 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
29090 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
290a0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
290b0 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
290c0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
290d0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
290e0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
290f0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
29100 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
29110 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
29120 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
29130 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
29140 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
29150 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
29160 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
29170 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
29180 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
29190 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
291a0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
291b0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
291c0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
291d0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
291e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
291f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
29200 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
29210 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
29220 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
29230 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
29240 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
29250 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
29260 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
29270 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
29280 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
29290 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
292a0 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
292b0 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
292c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
292d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
292e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
292f0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
29300 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
29310 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
29320 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
29330 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
29340 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
29350 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
29360 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
29370 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
29380 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
29390 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
293a0 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
293b0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
293c0 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
293d0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
293e0 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
293f0 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
29400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29410 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
29420 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
29430 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
29440 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
29450 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
29460 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
29470 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
29480 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
29490 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
294a0 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
294b0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
294c0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
294d0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
294e0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
294f0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
29500 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
29510 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
29520 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
29530 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
29540 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
29550 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
29560 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
29570 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
29580 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
29590 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
295a0 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
295b0 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
295c0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
295d0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
295e0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
295f0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
29600 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
29610 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
29620 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
29630 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29640 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
29650 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
29660 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
29670 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
29680 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
29690 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
296a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
296b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
296c0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
296d0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
296e0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
296f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
29700 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
29710 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
29720 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29730 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
29740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29750 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20  Trunk!=0 );.    
29760 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
29770 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20  ->aData!=0 );.. 
29780 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
29790 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
297a0 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65  [4]); /* # of le
297b0 61 76 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75  aves on this tru
297c0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  nk page */.     
297d0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
297e0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
297f0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
29800 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
29810 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
29820 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
29830 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
29840 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
29850 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
29860 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
29870 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
29880 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
29890 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
298a0 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
298b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
298c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
298d0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
298e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
298f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
29900 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
29910 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
29920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
29930 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
29940 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
29950 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
29960 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
29970 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
29980 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
29990 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
299a0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
299b0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
299c0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
299d0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
299e0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
299f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
29a00 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
29a10 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
29a20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
29a30 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
29a40 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
29a50 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
29a60 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
29a70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29a80 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
29a90 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29aa0 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
29ab0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
29ac0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
29ad0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a  if( searchList .
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
29af0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c  nearby==iTrunk |
29b00 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79  | (iTrunk<nearby
29b10 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
29b20 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29  OC_LE)) .      )
29b30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
29b40 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
29b50 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
29b60 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
29b70 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
29b80 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
29b90 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
29ba0 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
29bb0 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
29bc0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
29bd0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
29be0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
29bf0 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
29c00 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
29c10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29c20 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
29c30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29c40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
29c50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
29c60 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
29c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c80 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
29c90 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
29ca0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
29cb0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
29cc0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
29cd0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
29ce0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
29cf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29d00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29d10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
29d20 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
29d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
29d40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29d60 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
29d70 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
29d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29d90 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
29da0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
29db0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
29dc0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
29dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
29de0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
29df0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
29e00 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
29e10 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
29e20 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
29e30 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
29e40 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
29e50 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
29e60 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
29e70 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
29e80 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
29e90 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
29ea0 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
29eb0 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
29ec0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
29ed0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
29ee0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
29ef0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
29f00 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
29f10 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
29f20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
29f30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29f50 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29f60 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
29f70 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
29f80 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
29f90 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
29fa0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
29fb0 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
29fc0 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
29fd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
29fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29ff0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2a000 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2a010 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2a020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
2a030 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a040 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
2a050 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2a060 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a080 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2a090 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2a0a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2a0b0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2a0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a0d0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2a0e0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2a0f0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
2a100 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2a110 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2a120 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2a130 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2a140 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
2a150 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
2a160 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2a170 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
2a180 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2a190 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2a1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a1b0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2a1c0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2a1d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2a1e0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2a1f0 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
2a200 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2a210 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2a220 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
2a230 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
2a240 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2a250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a260 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2a270 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2a280 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2a290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a2a0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a2b0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a2d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2a2e0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2a2f0 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
2a300 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
2a320 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2a330 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2a340 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
2a350 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
2a360 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
2a370 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
2a380 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
2a390 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
2a3a0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
2a3b0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
2a3c0 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
2a3d0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
2a3e0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2a3f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
2a400 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
2a410 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
2a420 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
2a430 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
2a440 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2a450 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2a460 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2a470 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
2a480 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2a490 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
2a4a0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
2a4b0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2a4c0 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
2a4d0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
2a4e0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
2a4f0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2a500 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2a510 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a520 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2a530 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a550 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
2a560 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
2a570 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
2a580 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2a590 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
2a5a0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2a5b0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
2a5c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2a5d0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
2a5e0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2a5f0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2a600 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a620 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
2a640 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
2a650 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2a660 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
2a670 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a680 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2a690 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a6a0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2a6b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
2a6c0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
2a6d0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2a6e0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
2a6f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2a700 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
2a710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
2a720 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
2a730 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a740 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a750 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2a760 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2a770 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2a780 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a790 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
2a7a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
2a7b0 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2a7c0 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
2a7d0 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
2a7e0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
2a7f0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
2a800 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2a810 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
2a820 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
2a830 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
2a840 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2a850 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
2a860 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
2a870 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
2a880 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
2a890 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
2a8a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a8b0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
2a8c0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
2a8d0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
2a8e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a8f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a900 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2a910 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2a920 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2a930 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a940 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
2a950 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
2a960 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2a970 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2a980 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
2a990 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2a9a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
2a9b0 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
2a9c0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2a9d0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
2a9e0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
2a9f0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 3f 20  (pBt, *pPgno) ? 
2aa00 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
2aa10 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
2aa20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2aa30 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
2aa40 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
2aa50 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
2aa60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2aa70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2aa80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2aa90 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
2aaa0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
2aab0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2aac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
2aae0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
2aaf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2ab00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ab10 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2ab20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2ab30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2ab40 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
2ab50 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
2ab60 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
2ab70 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
2ab80 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
2ab90 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2aba0 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
2abb0 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
2abc0 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
2abd0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
2abe0 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
2abf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
2ac00 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
2ac10 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
2ac20 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
2ac30 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
2ac40 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
2ac50 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
2ac60 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
2ac70 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
2ac80 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
2ac90 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
2aca0 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
2acb0 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
2acc0 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
2acd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
2ace0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2acf0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
2ad00 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
2ad10 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
2ad20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
2ad30 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
2ad40 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
2ad50 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
2ad60 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
2ad70 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
2ad80 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
2ad90 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
2ada0 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
2adb0 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
2adc0 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
2add0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
2ade0 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
2adf0 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
2ae00 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
2ae10 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
2ae20 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
2ae30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ae40 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
2ae50 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
2ae60 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
2ae70 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
2ae80 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
2ae90 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
2aea0 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
2aeb0 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
2aec0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
2aed0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
2aee0 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
2aef0 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
2af00 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2af10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
2af20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
2af30 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
2af40 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
2af50 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
2af60 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2af70 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
2af80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
2af90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
2afa0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
2afb0 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
2afc0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
2afd0 6f 54 72 75 6e 63 61 74 65 29 29 20 3f 20 50 41  oTruncate)) ? PA
2afe0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
2aff0 54 20 3a 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d  T : 0;..    rc =
2b000 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b010 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
2b020 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2b030 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2b040 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
2b050 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
2b060 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2b070 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2b080 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
2b090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b0a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2b0b0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2b0c0 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
2b0d0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
2b0e0 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
2b0f0 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
2b100 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
2b110 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
2b120 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
2b130 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
2b140 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
2b150 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
2b160 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
2b170 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
2b180 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
2b190 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
2b1a0 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
2b1b0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2b1c0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
2b1d0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2b1e0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
2b1f0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2b200 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2b210 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
2b220 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
2b230 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
2b240 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
2b250 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
2b260 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2b270 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2b280 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  tPage(pBt, pBt->
2b290 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
2b2a0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2b2b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b2c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2b2d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b2e0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
2b2f0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2b300 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
2b310 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2b320 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b330 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
2b340 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
2b350 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
2b360 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2b370 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
2b380 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2b390 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
2b3a0 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
2b3b0 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
2b3c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
2b3d0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
2b3e0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
2b3f0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2b400 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2b410 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2b420 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
2b430 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
2b440 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
2b450 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b470 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2b480 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2b490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b4a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2b4b0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2b4c0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
2b4d0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2b4e0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2b4f0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
2b500 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2b510 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2b520 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2b530 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
2b540 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
2b550 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2b560 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2b570 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
2b580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b590 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2b5a0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2b5b0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
2b5c0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
2b5d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2b5e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
2b5f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b600 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
2b610 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
2b620 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
2b630 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
2b640 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
2b650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b660 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2b670 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50  swriteable((*ppP
2b680 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29  age)->pDbPage) )
2b690 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2b6a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2b6b0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2b6c0 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
2b6d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2b6e0 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
2b6f0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
2b700 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
2b710 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
2b720 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
2b730 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
2b740 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
2b750 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2b760 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2b770 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
2b780 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
2b790 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
2b7a0 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
2b7b0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
2b7c0 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
2b7d0 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
2b7e0 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
2b7f0 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
2b800 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
2b810 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
2b820 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
2b830 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
2b840 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
2b850 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
2b860 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2b870 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
2b880 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2b890 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
2b8a0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2b8b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b8c0 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
2b8d0 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
2b8e0 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
2b8f0 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
2b900 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b920 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
2b930 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
2b940 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b960 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
2b970 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
2b980 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
2b990 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
2b9a0 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
2b9b0 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
2b9c0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
2b9d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b9e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b9f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
2ba00 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
2ba10 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
2ba20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba40 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2ba50 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
2ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
2ba80 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
2ba90 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
2baa0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
2bab0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2bac0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2bad0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67  ;.  assert( iPag
2bae0 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
2baf0 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
2bb00 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
2bb10 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d  age );..  if( pM
2bb20 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
2bb30 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
2bb40 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2bb50 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
2bb60 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
2bb70 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
2bb80 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
2bb90 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
2bba0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
2bbb0 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
2bbc0 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
2bbd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2bbe0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
2bbf0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2bc00 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
2bc10 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
2bc20 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2bc30 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
2bc40 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2bc50 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
2bc60 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
2bc70 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
2bc80 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
2bc90 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
2bca0 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
2bcb0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
2bcc0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
2bcd0 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
2bce0 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
2bcf0 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
2bd00 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
2bd10 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
2bd20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2bd30 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
2bd40 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
2bd50 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
2bd60 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
2bd70 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2bd80 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
2bd90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
2bda0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2bdb0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2bdc0 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
2bdd0 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
2bde0 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
2bdf0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2be00 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
2be10 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
2be20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
2be30 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
2be40 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
2be50 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
2be60 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
2be70 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2be80 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2be90 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
2bea0 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
2beb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2bec0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2bed0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
2bee0 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
2bef0 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
2bf00 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
2bf10 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
2bf20 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
2bf30 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
2bf40 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
2bf50 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
2bf60 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
2bf70 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
2bf80 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
2bf90 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
2bfa0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
2bfb0 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
2bfc0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2bfd0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2bfe0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
2bff0 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
2c000 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
2c010 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
2c020 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
2c030 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
2c040 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
2c050 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
2c060 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
2c070 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
2c080 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
2c090 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0b0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
2c0c0 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
2c0d0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
2c0e0 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
2c0f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2c100 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
2c110 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2c120 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
2c130 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
2c140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
2c160 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2c170 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
2c180 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2c190 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2c1a0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2c1b0 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
2c1c0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
2c1d0 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
2c1e0 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
2c1f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c200 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2c210 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2c220 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2c230 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
2c240 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
2c250 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
2c260 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
2c270 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
2c280 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
2c290 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
2c2a0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
2c2b0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
2c2c0 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
2c2d0 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
2c2e0 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
2c2f0 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
2c300 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
2c310 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
2c320 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
2c330 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
2c340 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2c350 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
2c360 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
2c370 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
2c380 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
2c390 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
2c3a0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
2c3b0 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
2c3c0 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
2c3d0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2c3e0 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
2c3f0 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
2c400 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
2c410 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
2c420 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
2c430 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
2c440 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
2c450 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
2c460 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
2c470 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
2c480 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
2c490 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
2c4a0 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
2c4b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
2c4c0 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
2c4d0 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
2c4e0 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
2c4f0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
2c500 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
2c510 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
2c520 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
2c530 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
2c540 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
2c550 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
2c560 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
2c570 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
2c580 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
2c590 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
2c5a0 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
2c5b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2c5c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c5d0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2c5e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2c5f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c600 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
2c610 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2c620 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
2c630 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2c640 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2c650 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
2c660 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2c670 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62  pPage && (pBt->b
2c680 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
2c690 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  CURE_DELETE)==0 
2c6a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2c6b0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
2c6c0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2c6d0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2c6e0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2c6f0 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
2c700 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
2c710 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
2c720 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
2c730 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
2c740 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
2c750 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
2c760 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
2c770 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2c780 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
2c790 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
2c7a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2c7b0 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
2c7c0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
2c7d0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
2c7e0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
2c7f0 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
2c800 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
2c810 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2c820 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
2c830 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
2c840 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
2c850 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
2c860 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
2c870 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
2c880 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
2c890 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
2c8a0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
2c8b0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
2c8c0 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
2c8d0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
2c8e0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
2c8f0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
2c900 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
2c910 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2c920 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2c930 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
2c940 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2c950 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
2c960 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c970 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2c980 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2c990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
2c9a0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2c9b0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
2c9c0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
2c9d0 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
2c9e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2c9f0 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
2ca00 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2ca10 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
2ca20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
2ca30 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
2ca40 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
2ca50 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
2ca60 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
2ca70 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
2ca80 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
2ca90 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
2caa0 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
2cab0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
2cac0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
2cad0 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
2cae0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
2caf0 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
2cb00 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
2cb10 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
2cb20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cb30 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
2cb40 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
2cb50 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
2cb60 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
2cb70 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
2cb80 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
2cb90 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
2cba0 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
2cbb0 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
2cbc0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2cbd0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2cbe0 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
2cbf0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2cc00 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
2cc10 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
2cc20 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
2cc30 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
2cc40 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
2cc50 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
2cc60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2cc70 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2cc80 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61  ex) );.  btreePa
2cc90 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2cca0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
2ccb0 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
2ccc0 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  rflow==0 ){.    
2ccd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2cce0 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
2ccf0 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
2cd00 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2cd10 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
2cd20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69  if( pCell+info.i
2cd30 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61  Overflow+3 > pPa
2cd40 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
2cd50 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20  >maskPage ){.   
2cd60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2cd70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a  ORRUPT_BKPT;  /*
2cd80 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61   Cell extends pa
2cd90 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a  st end of page *
2cda0 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
2cdb0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
2cdc0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
2cdd0 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w]);.  assert( p
2cde0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
2cdf0 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
2ce00 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
2ce10 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
2ce20 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
2ce30 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
2ce40 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
2ce50 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
2ce60 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
2ce70 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
2ce80 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
2ce90 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
2cea0 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
2ceb0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
2cec0 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
2ced0 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
2cee0 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
2cef0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
2cf00 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
2cf10 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
2cf20 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
2cf30 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
2cf40 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2cf50 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
2cf60 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
2cf70 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2cf80 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
2cf90 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
2cfa0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
2cfb0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
2cfc0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2cfd0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2cfe0 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
2cff0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
2d000 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
2d010 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
2d020 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
2d030 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2d040 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2d050 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
2d060 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
2d070 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
2d080 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
2d090 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
2d0a0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
2d0b0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
2d0c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2d0d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
2d0e0 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
2d0f0 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
2d100 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2d110 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
2d120 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2d130 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
2d140 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
2d150 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
2d160 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
2d170 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
2d180 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
2d190 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
2d1a0 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
2d1b0 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
2d1c0 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
2d1d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
2d1e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
2d1f0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
2d200 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
2d210 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
2d220 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
2d230 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
2d240 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
2d250 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
2d260 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
2d270 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
2d280 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
2d290 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
2d2a0 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
2d2b0 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
2d2c0 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
2d2d0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
2d2e0 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
2d2f0 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
2d300 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
2d310 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
2d320 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
2d330 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
2d340 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2d350 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2d360 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
2d370 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2d380 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
2d390 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
2d3a0 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
2d3b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
2d3c0 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
2d3d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
2d3e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2d3f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
2d400 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
2d410 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2d420 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2d430 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
2d440 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
2d450 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
2d460 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
2d470 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
2d480 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
2d490 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
2d4a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
2d4b0 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
2d4c0 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
2d4d0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
2d4e0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
2d4f0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
2d500 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
2d510 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
2d520 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
2d530 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
2d540 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
2d550 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
2d560 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
2d570 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
2d580 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
2d590 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
2d5a0 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
2d5b0 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
2d5c0 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
2d5d0 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
2d5e0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
2d5f0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
2d600 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
2d610 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
2d620 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
2d630 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
2d640 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
2d650 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
2d660 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2d670 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2d680 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
2d690 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2d6a0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
2d6b0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
2d6c0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
2d6d0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2d6e0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2d6f0 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
2d700 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
2d710 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
2d720 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
2d730 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
2d740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2d750 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
2d760 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
2d770 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
2d780 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
2d790 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2d7a0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
2d7b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
2d7c0 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
2d7d0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
2d7e0 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
2d7f0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
2d800 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2d810 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
2d820 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
2d830 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
2d840 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
2d850 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
2d860 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2d870 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2d880 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
2d890 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
2d8a0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
2d8b0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
2d8c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2d8d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2d8e0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
2d8f0 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
2d900 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
2d910 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
2d920 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
2d930 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
2d940 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
2d950 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
2d960 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
2d970 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
2d980 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2d990 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
2d9a0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2d9b0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2d9c0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2d9d0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2d9e0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2d9f0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2da00 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
2da10 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
2da20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2da30 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
2da40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
2da50 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
2da60 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2da70 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2da80 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
2da90 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
2daa0 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
2dab0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
2dac0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
2dad0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2dae0 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
2daf0 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
2db00 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2db10 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
2db20 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
2db30 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
2db40 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
2db50 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
2db60 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
2db70 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
2db80 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
2db90 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
2dba0 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
2dbb0 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
2dbc0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
2dbd0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
2dbe0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
2dbf0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2dc00 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
2dc10 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
2dc20 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
2dc30 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
2dc40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2dc50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2dc60 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2dc70 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
2dc80 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
2dc90 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
2dca0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
2dcb0 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
2dcc0 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
2dcd0 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
2dce0 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
2dcf0 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
2dd00 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
2dd10 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2dd20 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
2dd30 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
2dd40 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
2dd50 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
2dd60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2dd70 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
2dd80 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
2dd90 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
2dda0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
2ddb0 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
2ddc0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2ddd0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2dde0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
2ddf0 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
2de00 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
2de10 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
2de20 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
2de30 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
2de40 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
2de50 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
2de60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2de70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
2de80 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2de90 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
2dea0 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
2deb0 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
2dec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ded0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2dee0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2def0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2df00 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
2df10 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
2df20 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
2df30 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
2df40 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
2df50 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
2df60 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2df70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
2df80 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
2df90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2dfa0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
2dfb0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
2dfc0 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
2dfd0 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
2dfe0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
2dff0 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
2e000 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
2e010 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
2e020 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
2e030 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
2e040 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
2e050 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
2e060 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
2e070 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
2e080 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
2e090 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c  ninitialized val
2e0a0 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
2e0b0 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
2e0c0 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
2e0d0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
2e0e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2e0f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2e100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e110 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2e120 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
2e130 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
2e140 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
2e150 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
2e160 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2e170 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
2e180 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
2e190 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2e1a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
2e1b0 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
2e1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e1d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2e1e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2e1f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2e200 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
2e210 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e220 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
2e230 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2e240 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
2e250 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
2e260 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2e270 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2e280 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2e290 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2e2a0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2e2b0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2e2c0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2e2d0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2e2e0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
2e2f0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
2e300 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2e310 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
2e320 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
2e330 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
2e340 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
2e350 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2e360 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
2e370 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
2e380 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
2e390 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
2e3a0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2e3b0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2e3c0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2e3d0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2e3e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2e3f0 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
2e400 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
2e410 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
2e420 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2e430 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
2e440 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
2e450 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
2e460 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
2e470 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2e480 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
2e490 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
2e4a0 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
2e4b0 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
2e4c0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
2e4d0 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
2e4e0 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
2e4f0 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
2e500 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
2e510 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2e520 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2e530 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
2e540 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2e550 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
2e560 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2e570 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2e580 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2e590 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
2e5a0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
2e5b0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
2e5c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
2e5d0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
2e5e0 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
2e5f0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
2e600 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
2e610 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
2e620 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
2e630 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
2e640 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
2e650 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
2e660 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
2e670 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
2e680 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2e690 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2e6a0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2e6b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2e6c0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2e6d0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
2e6e0 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
2e6f0 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
2e700 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
2e710 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
2e720 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
2e730 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
2e740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
2e750 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
2e760 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
2e770 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
2e780 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
2e790 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
2e7a0 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
2e7b0 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
2e7c0 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
2e7d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
2e7e0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
2e7f0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2e800 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
2e810 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2e820 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2e830 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e840 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
2e850 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2e860 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
2e870 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
2e880 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
2e890 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
2e8a0 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
2e8b0 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
2e8c0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
2e8d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
2e8e0 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
2e8f0 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
2e900 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
2e910 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
2e920 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
2e930 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
2e940 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
2e950 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
2e960 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
2e970 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
2e980 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
2e990 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2e9a0 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
2e9b0 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
2e9c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
2e9d0 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
2e9e0 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
2e9f0 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
2ea00 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
2ea10 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
2ea20 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2ea30 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
2ea40 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
2ea50 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
2ea60 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20  /.  u8 *endPtr; 
2ea70 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 6f      /* End of lo
2ea80 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  op */.  int rc; 
2ea90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2eaa0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2eab0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
2eac0 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
2ead0 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d  the header.  0 m
2eae0 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20  ost pages.  100 
2eaf0 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28  page 1 */..  if(
2eb00 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2eb10 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2eb20 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
2eb30 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
2eb40 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
2eb50 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
2eb60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2eb70 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2eb80 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2eb90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2eba0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ebb0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2ebc0 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
2ebd0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2ebe0 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
2ebf0 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20  ellIdx[2*idx];. 
2ec00 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
2ec10 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
2ec20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
2ec30 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
2ec40 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2ec50 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
2ec60 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
2ec70 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2ec80 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c  ze );.  if( pc <
2ec90 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26   (u32)get2byte(&
2eca0 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20  data[hdr+5]) || 
2ecb0 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
2ecc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2ecd0 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
2ece0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2ecf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2ed00 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
2ed10 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
2ed20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2ed30 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
2ed40 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2ed50 65 6e 64 50 74 72 20 3d 20 26 70 50 61 67 65 2d  endPtr = &pPage-
2ed60 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 70 50 61 67  >aCellIdx[2*pPag
2ed70 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32 5d 3b 0a 20  e->nCell - 2];. 
2ed80 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
2ed90 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29  _PTR_TO_INT(ptr)
2eda0 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74  &1)==0 );  /* pt
2edb0 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79  r is always 2-by
2edc0 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20  te aligned */.  
2edd0 77 68 69 6c 65 28 20 70 74 72 3c 65 6e 64 50 74  while( ptr<endPt
2ede0 72 20 29 7b 0a 20 20 20 20 2a 28 75 31 36 2a 29  r ){.    *(u16*)
2edf0 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74  ptr = *(u16*)&pt
2ee00 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 20 2b 3d  r[2];.    ptr +=
2ee10 20 32 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d   2;.  }.  pPage-
2ee20 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
2ee30 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
2ee40 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2ee50 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2ee60 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   += 2;.}../*.** 
2ee70 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
2ee80 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
2ee90 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
2eea0 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
2eeb0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
2eec0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
2eed0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
2eee0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
2eef0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
2ef00 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
2ef10 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
2ef20 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
2ef30 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
2ef40 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
2ef50 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
2ef60 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
2ef70 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
2ef80 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
2ef90 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
2efa0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20  pPage->apOvfl[] 
2efb0 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
2efc0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
2efd0 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
2efe0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
2eff0 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
2f000 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
2f010 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
2f020 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
2f030 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
2f040 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
2f050 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
2f060 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
2f070 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
2f080 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
2f090 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
2f0a0 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
2f0b0 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
2f0c0 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
2f0d0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
2f0e0 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
2f0f0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
2f100 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
2f110 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
2f120 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
2f130 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
2f140 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
2f150 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
2f160 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
2f170 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
2f180 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f190 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
2f1a0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2f1b0 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
2f1c0 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
2f1d0 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
2f1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2f1f0 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
2f200 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
2f210 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
2f220 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
2f230 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2f240 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
2f250 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
2f260 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
2f270 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
2f280 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
2f290 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
2f2a0 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
2f2b0 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
2f2c0 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
2f2d0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
2f2e0 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
2f2f0 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
2f300 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
2f310 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
2f320 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
2f330 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
2f340 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
2f350 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
2f360 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
2f370 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
2f380 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
2f390 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
2f3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2f3b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
2f3c0 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
2f3d0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
2f3e0 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
2f3f0 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
2f400 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
2f410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2f420 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
2f430 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
2f440 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
2f450 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
2f460 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
2f470 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
2f480 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
2f490 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
2f4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f4b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
2f4c0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
2f4d0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
2f4e0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
2f4f0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2f500 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
2f510 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72   */.  u8 *endPtr
2f520 3b 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ;       /* End o
2f530 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  f the loop */.. 
2f540 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43   int nSkip = (iC
2f550 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a  hild ? 4 : 0);..
2f560 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2f570 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2f580 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
2f590 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
2f5a0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
2f5b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2f5c0 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2f5d0 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
2f5e0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2f5f0 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
2f600 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2f610 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
2f620 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b  Page->apOvfl) );
2f630 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
2f640 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
2f650 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70  fl)==ArraySize(p
2f660 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b  Page->aiOvfl) );
2f670 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f680 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2f690 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2f6a0 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
2f6b0 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
2f6c0 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
2f6d0 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
2f6e0 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
2f6f0 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
2f700 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
2f710 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
2f720 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
2f730 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
2f740 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
2f750 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
2f760 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
2f770 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
2f780 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
2f790 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
2f7a0 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
2f7b0 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
2f7c0 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
2f7d0 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
2f7e0 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
2f7f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2f800 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
2f810 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
2f820 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2f830 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
2f840 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
2f850 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
2f860 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
2f870 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
2f880 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
2f890 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2f8a0 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
2f8b0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2f8c0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
2f8d0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
2f8e0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2f8f0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
2f900 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
2f910 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
2f920 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
2f930 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
2f940 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
2f950 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
2f960 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
2f970 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
2f980 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
2f990 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
2f9a0 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
2f9b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2f9c0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2f9d0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2f9e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2f9f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fa00 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2fa10 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2fa20 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
2fa30 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2fa40 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2fa50 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2fa60 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
2fa70 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
2fa80 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
2fa90 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
2faa0 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
2fab0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2fac0 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
2fad0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
2fae0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2faf0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
2fb00 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
2fb10 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
2fb20 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
2fb30 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
2fb40 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
2fb50 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
2fb60 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
2fb70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
2fb80 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
2fb90 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
2fba0 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
2fbb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2fbc0 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
2fbd0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2fbe0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
2fbf0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
2fc00 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
2fc10 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
2fc20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
2fc30 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
2fc40 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2fc50 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  p);.    if( iChi
2fc60 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2fc70 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
2fc80 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2fc90 20 20 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b      ptr = &data[
2fca0 65 6e 64 5d 3b 0a 20 20 20 20 65 6e 64 50 74 72  end];.    endPtr
2fcb0 20 3d 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0a 20   = &data[ins];. 
2fcc0 20 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49     assert( (SQLI
2fcd0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74  TE_PTR_TO_INT(pt
2fce0 72 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20  r)&1)==0 );  /* 
2fcf0 70 74 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d  ptr is always 2-
2fd00 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a  byte aligned */.
2fd10 20 20 20 20 77 68 69 6c 65 28 20 70 74 72 3e 65      while( ptr>e
2fd20 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 20 20 2a  ndPtr ){.      *
2fd30 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31  (u16*)ptr = *(u1
2fd40 36 2a 29 26 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  6*)&ptr[-2];.   
2fd50 20 20 20 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20     ptr -= 2;.   
2fd60 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
2fd70 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
2fd80 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
2fd90 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
2fda0 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
2fdb0 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  >nCell);.#ifndef
2fdc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2fdd0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2fde0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
2fdf0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
2fe00 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
2fe10 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
2fe20 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
2fe30 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
2fe40 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
2fe50 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
2fe60 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
2fe70 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
2fe80 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
2fe90 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
2fea0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2feb0 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e   pRC);.    }.#en
2fec0 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
2fed0 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
2fee0 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
2fef0 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
2ff00 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
2ff10 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
2ff20 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
2ff30 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
2ff40 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
2ff50 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
2ff60 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2ff70 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
2ff80 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
2ff90 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
2ffa0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
2ffb0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2ffc0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
2ffd0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2ffe0 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
2fff0 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
30000 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
30010 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
30020 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
30030 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
30040 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
30050 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
30060 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b  .  u8 *pCellptr;
30070 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
30080 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
30090 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
300a0 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
300b0 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
300c0 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
300d0 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
300e0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
300f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
30100 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
30110 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
30120 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
30130 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
30140 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
30150 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
30160 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
30170 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50  int nUsable = pP
30180 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
30190 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
301a0 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a  size of page */.
301b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
301c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
301d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
301e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
301f0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
30200 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
30210 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c  Cell>=0 && nCell
30220 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70  <=(int)MX_CELL(p
30230 50 61 67 65 2d 3e 70 42 74 29 0a 20 20 20 20 20  Page->pBt).     
30240 20 20 20 20 20 20 20 26 26 20 28 69 6e 74 29 4d         && (int)M
30250 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
30260 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61 73  t)<=10921);.  as
30270 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
30280 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
30290 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
302a0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
302b0 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a  t the page has j
302c0 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20  ust been zeroed 
302d0 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f  by zeroPage() */
302e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
302f0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
30300 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
30310 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
30320 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29  r+5])==nUsable )
30330 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20  ;..  pCellptr = 
30340 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
30350 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c  [nCell*2];.  cel
30360 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b  lbody = nUsable;
30370 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31  .  for(i=nCell-1
30380 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
30390 20 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a 65    u16 sz = aSize
303a0 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  [i];.    pCellpt
303b0 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c  r -= 2;.    cell
303c0 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20  body -= sz;.    
303d0 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
303e0 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  r, cellbody);.  
303f0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
30400 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
30410 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20  [i], sz);.  }.  
30420 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
30430 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
30440 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
30450 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79  hdr+5], cellbody
30460 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
30470 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20  e -= (nCell*2 + 
30480 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f  nUsable - cellbo
30490 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  dy);.  pPage->nC
304a0 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
304b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
304c0 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
304d0 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
304e0 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
304f0 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
30500 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
30510 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
30520 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
30530 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
30540 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
30550 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
30560 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
30570 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
30580 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
30590 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
305a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
305b0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
305c0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
305d0 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
305e0 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
305f0 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
30600 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
30610 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
30620 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
30630 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
30640 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
30650 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
30660 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
30670 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
30680 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
30690 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
306a0 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
306b0 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
306c0 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
306d0 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
306e0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
306f0 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
30700 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
30710 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
30720 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
30730 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30740 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
30750 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
30760 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
30770 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
30780 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
30790 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
307a0 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  ance */...#ifnde
307b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
307c0 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
307d0 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
307e0 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
307f0 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
30800 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
30810 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
30820 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
30830 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
30840 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
30850 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
30860 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
30870 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
30880 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
30890 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
308a0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
308b0 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
308c0 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74  ing to balance t
308d0 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
308e0 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
308f0 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
30900 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
30910 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
30920 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
30930 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
30940 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
30950 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
30960 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
30970 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
30980 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
30990 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
309a0 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
309b0 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
309c0 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
309d0 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
309e0 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
309f0 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
30a00 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
30a10 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
30a20 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
30a30 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
30a40 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
30a50 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
30a60 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
30a70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
30a80 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
30a90 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
30aa0 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
30ab0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
30ac0 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
30ad0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70  e..**.** The pSp
30ae0 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73  ace buffer is us
30af0 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65  ed to store a te
30b00 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20  mporary copy of 
30b10 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63  the divider.** c
30b20 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
30b30 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70   inserted into p
30b40 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63  Parent. Such a c
30b50 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
30b60 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65  a 4.** byte page
30b70 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64   number followed
30b80 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c   by a variable l
30b90 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49  ength integer. I
30ba0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
30bb0 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74  , at most 13 byt
30bc0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53  es. Hence the pS
30bd0 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74  pace buffer must
30be0 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20   be at.** least 
30bf0 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
30c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30c10 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
30c20 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
30c30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
30c40 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42  u8 *pSpace){.  B
30c50 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70  tShared *const p
30c60 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
30c70 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61      /* B-Tree Da
30c80 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50  tabase */.  MemP
30c90 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  age *pNew;      
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cb0 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
30cc0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ted page */.  in
30cd0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
30ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cf0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
30d00 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
30d10 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
30d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30d30 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e  age number of pN
30d40 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ew */..  assert(
30d50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
30d60 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
30d70 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
30d80 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
30d90 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
30da0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
30db0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30dc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
30dd0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72  ;..  /* This err
30de0 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  or condition is 
30df0 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72  now caught prior
30e00 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69   to reaching thi
30e10 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
30e20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
30e30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
30e40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30e50 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
30e60 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69   a new page. Thi
30e70 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
30e80 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62  me the right-sib
30e90 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50  ling of .  ** pP
30ea0 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  age. Make the pa
30eb0 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62  rent page writab
30ec0 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20  le, so that the 
30ed0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
30ee0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73  .  ** may be ins
30ef0 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74  erted. If both t
30f00 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  hese operations 
30f10 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20  are successful, 
30f20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
30f30 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
30f40 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
30f50 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
30f60 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  0);..  if( rc==S
30f70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
30f80 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70   u8 *pOut = &pSp
30f90 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a  ace[4];.    u8 *
30fa0 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
30fb0 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31  pOvfl[0];.    u1
30fc0 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53  6 szCell = cellS
30fd0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
30fe0 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53  ell);.    u8 *pS
30ff0 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  top;..    assert
31000 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
31010 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e  writeable(pNew->
31020 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
31030 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
31040 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e  Data[0]==(PTF_IN
31050 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
31060 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20  A|PTF_LEAF) );. 
31070 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
31080 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
31090 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
310a0 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  AF);.    assembl
310b0 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26  ePage(pNew, 1, &
310c0 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b  pCell, &szCell);
310d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
310e0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
310f0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
31100 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
31110 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
31120 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
31130 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
31140 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
31150 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
31160 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
31170 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
31180 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
31190 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  ese.    ** opera
311a0 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65  tions fails, the
311b0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
311c0 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e  set, but the con
311d0 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  tents.    ** of 
311e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
311f0 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75  are still manipu
31200 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64  lated by thh cod
31210 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20  e below..    ** 
31220 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74  That is Ok, at t
31230 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
31240 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61  rent page is gua
31250 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a  ranteed to.    *
31260 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  * be marked as d
31270 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20  irty. Returning 
31280 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69  an error code wi
31290 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a  ll cause a.    *
312a0 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f  * rollback, undo
312b0 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ing any changes 
312c0 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65  made to the pare
312d0 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
312e0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
312f0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
31300 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
31310 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
31320 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
31330 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
31340 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e  f( szCell>pNew->
31350 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
31360 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
31370 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
31380 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
31390 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
313a0 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72  Create a divider
313b0 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20   cell to insert 
313c0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68  into pParent. Th
313d0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  e divider cell. 
313e0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f     ** consists o
313f0 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20  f a 4-byte page 
31400 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65  number (the page
31410 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65   number of pPage
31420 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76  ) and.    ** a v
31430 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
31440 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20  ey value (which 
31450 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
31460 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20   value as the.  
31470 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
31480 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20   on pPage)..    
31490 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e  **.    ** To fin
314a0 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  d the largest ke
314b0 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65  y value on pPage
314c0 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65  , first find the
314d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20   right-most .   
314e0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
314f0 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f  e. The first two
31500 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20   fields of this 
31510 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20  cell are the .  
31520 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67    ** record-leng
31530 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  th (a variable l
31540 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74  ength integer at
31550 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e   most 32-bits in
31560 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e   size).    ** an
31570 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  d the key value 
31580 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
31590 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20  th integer, may 
315a0 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e  have any value).
315b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
315c0 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e  t of the while(.
315d0 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20  ..) loops below 
315e0 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72  skips over the r
315f0 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20  ecord-length.   
31600 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73   ** field. The s
31610 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29  econd while(...)
31620 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65   loop copies the
31630 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20   key value from 
31640 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  the.    ** cell 
31650 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68  on pPage into th
31660 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  e pSpace buffer.
31670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c  .    */.    pCel
31680 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
31690 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
316a0 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  -1);.    pStop =
316b0 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
316c0 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b  while( (*(pCell+
316d0 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  +)&0x80) && pCel
316e0 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70  l<pStop );.    p
316f0 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
31700 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a  ;.    while( ((*
31710 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65  (pOut++) = *(pCe
31720 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20  ll++))&0x80) && 
31730 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a  pCell<pStop );..
31740 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
31750 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
31760 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ll into pParent.
31770 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65   */.    insertCe
31780 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72  ll(pParent, pPar
31790 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61  ent->nCell, pSpa
317a0 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70  ce, (int)(pOut-p
317b0 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20  Space),.        
317c0 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d         0, pPage-
317d0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20  >pgno, &rc);..  
317e0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
317f0 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
31800 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
31810 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
31820 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
31830 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
31840 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
31850 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
31860 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
31870 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
31880 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
31890 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
318a0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
318b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
318c0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
318d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
318e0 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
318f0 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
31900 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
31910 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
31920 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
31930 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
31940 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
31950 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
31960 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
31970 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
31980 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
31990 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
319a0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
319b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
319c0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
319d0 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
319e0 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
319f0 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
31a00 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
31a10 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
31a20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
31a30 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
31a40 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
31a50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
31a60 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
31a70 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
31a80 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
31a90 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
31aa0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
31ab0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
31ac0 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
31ad0 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
31ae0 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
31af0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
31b00 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
31b10 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
31b20 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
31b30 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
31b40 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
31b50 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
31b60 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
31b70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
31b80 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
31b90 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
31ba0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
31bb0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
31bc0 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
31bd0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31be0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
31bf0 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
31c00 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
31c10 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
31c20 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
31c30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31c40 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
31c50 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
31c60 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
31c70 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
31c80 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
31c90 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
31ca0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
31cb0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
31cc0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
31cd0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
31ce0 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
31cf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
31d00 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
31d10 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
31d20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
31d30 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
31d40 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
31d50 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
31d60 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
31d70 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
31d80 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
31d90 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
31da0 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
31db0 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
31dc0 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
31dd0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
31de0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
31df0 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
31e00 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
31e10 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
31e20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
31e30 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
31e40 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
31e50 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
31e60 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
31e70 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
31e80 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
31e90 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
31ea0 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
31eb0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
31ec0 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
31ed0 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
31ee0 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
31ef0 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
31f00 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
31f10 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
31f20 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
31f30 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
31f40 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20  emPage.apOvfl[] 
31f50 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65  array), they are
31f60 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70   not copied to p
31f70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  To. .**.** Befor
31f80 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67  e returning, pag
31f90 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69  e pTo is reiniti
31fa0 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72  alized using btr
31fb0 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
31fc0 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61  .** The performa
31fd0 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  nce of this func
31fe0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74  tion is not crit
31ff0 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ical. It is only
32000 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65   used by .** the
32010 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
32020 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65  er() and balance
32030 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64  _deeper() proced
32040 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66  ures, neither of
32050 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61  .** which are ca
32060 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72  lled often under
32070 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74   normal circumst
32080 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ances..*/.static
32090 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f   void copyNodeCo
320a0 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70  ntent(MemPage *p
320b0 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70  From, MemPage *p
320c0 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  To, int *pRC){. 
320d0 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
320e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74  ITE_OK ){.    Bt
320f0 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70  Shared * const p
32100 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  Bt = pFrom->pBt;
32110 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
32120 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61  aFrom = pFrom->a
32130 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63  Data;.    u8 * c
32140 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e  onst aTo = pTo->
32150 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63  aData;.    int c
32160 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20  onst iFromHdr = 
32170 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74  pFrom->hdrOffset
32180 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
32190 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e  iToHdr = ((pTo->
321a0 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a  pgno==1) ? 100 :
321b0 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b   0);.    int rc;
321c0 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a  .    int iData;.
321d0 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74    .  .    assert
321e0 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20  ( pFrom->isInit 
321f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32200 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f  From->nFree>=iTo
32210 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Hdr );.    asser
32220 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72  t( get2byte(&aFr
32230 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20  om[iFromHdr+5]) 
32240 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
32250 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20  bleSize );.  .  
32260 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d    /* Copy the b-
32270 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e  tree node conten
32280 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f  t from page pFro
32290 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a  m to page pTo. *
322a0 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67 65  /.    iData = ge
322b0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
322c0 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20  romHdr+5]);.    
322d0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74  memcpy(&aTo[iDat
322e0 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61  a], &aFrom[iData
322f0 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
32300 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d  ze-iData);.    m
32310 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64  emcpy(&aTo[iToHd
32320 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  r], &aFrom[iFrom
32330 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c  Hdr], pFrom->cel
32340 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f  lOffset + 2*pFro
32350 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20  m->nCell);.  .  
32360 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a    /* Reinitializ
32370 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68  e page pTo so th
32380 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
32390 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
323a0 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20  tructure.    ** 
323b0 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61  match the new da
323c0 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69  ta. The initiali
323d0 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61  zation of pTo ca
323e0 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20  n actually fail 
323f0 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69  under.    ** fai
32400 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72 63  rly obscure circ
32410 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20  umstances, even 
32420 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20 63  though it is a c
32430 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  opy of initializ
32440 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ed .    ** page 
32450 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  pFrom..    */.  
32460 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20    pTo->isInit = 
32470 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  0;.    rc = btre
32480 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a  eInitPage(pTo);.
32490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
324a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
324b0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
324c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
324d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
324e0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
324f0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
32500 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
32510 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
32520 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65  * for any b-tree
32530 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
32540 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20  es that pTo now 
32550 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
32560 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f  nters to..    */
32570 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
32580 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a  ACUUM ){.      *
32590 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74  pRC = setChildPt
325a0 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20  rmaps(pTo);.    
325b0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
325c0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
325d0 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20  stributes cells 
325e0 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64  on the iParentId
325f0 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50  x'th child of pP
32600 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66  arent.** (hereaf
32610 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20  ter "the page") 
32620 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c  and up to 2 sibl
32630 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  ings so that all
32640 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
32650 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d  t the.** same am
32660 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
32670 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69  ce. Usually a si
32680 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20  ngle sibling on 
32690 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
326a0 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75  he.** page are u
326b0 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
326c0 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74  cing, though bot
326d0 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  h siblings might
326e0 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a   come from one.*
326f0 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61  * side if the pa
32700 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  ge is the first 
32710 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
32720 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20   its parent. If 
32730 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73  the page .** has
32740 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69   fewer than 2 si
32750 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e  blings (somethin
32760 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
32770 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70   happen if the p
32780 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74  age.** is a root
32790 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64   page or a child
327a0 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29   of a root page)
327b0 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
327c0 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  ble siblings.** 
327d0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
327e0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
327f0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
32800 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68  f siblings of th
32810 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  e page might be 
32820 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
32830 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e  reased by .** on
32840 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65  e or two in an e
32850 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
32860 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
32870 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
32880 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  l. .**.** Note t
32890 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
328a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
328b0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   some of the cel
328c0 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ls on the page.*
328d0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
328e0 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
328f0 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  n MemPage.aData[
32900 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ]. This can happ
32910 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
32920 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54  e is overfull. T
32930 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
32940 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c  res that all cel
32950 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ls allocated.** 
32960 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
32970 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74  its siblings fit
32980 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44   into MemPage.aD
32990 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74  ata[] before ret
329a0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  urning..**.** In
329b0 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
329c0 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67  alancing the pag
329d0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
329e0 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65  gs, cells may be
329f0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
32a00 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
32a10 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
32a20 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69  e (pParent). Doi
32a30 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75  ng so.** may cau
32a40 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  se the parent pa
32a50 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  ge to become ove
32a60 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
32a70 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68  ll. If this.** h
32a80 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68  appens, it is th
32a90 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
32aa0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
32ab0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72  o invoke the cor
32ac0 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e  rect.** balancin
32ad0 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78  g routine to fix
32ae0 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73   this problem (s
32af0 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  ee the balance()
32b00 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a   routine). .**.*
32b10 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
32b20 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
32b30 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
32b40 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
32b50 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
32b60 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20  upted state. So 
32b70 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
32b80 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
32b90 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
32ba0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
32bb0 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
32bc0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
32bd0 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70  unction, aOvflSp
32be0 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  ace, is a pointe
32bf0 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72  r to a.** buffer
32c00 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
32c10 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66  old one page. If
32c20 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67   while inserting
32c30 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
32c40 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28  parent.** page (
32c50 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61 72  pParent) the par
32c60 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
32c70 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20   overfull, this 
32c80 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65  buffer is.** use
32c90 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70  d to store the p
32ca0 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77  arent's overflow
32cb0 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20   cells. Because 
32cc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
32cd0 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d  serts.** a maxim
32ce0 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64  um of four divid
32cf0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
32d00 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61  e parent page, a
32d10 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  nd the maximum.*
32d20 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * size of a cell
32d30 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61   stored within a
32d40 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  n internal node 
32d50 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74  is always less t
32d60 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68  han 1/4.** of th
32d70 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
32d80 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75   aOvflSpace[] bu
32d90 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  ffer is guarante
32da0 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a  ed to be large.*
32db0 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c  * enough for all
32dc0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
32dd0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53  .**.** If aOvflS
32de0 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20 61  pace is set to a
32df0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74   null pointer, t
32e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
32e10 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
32e20 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64 65  NOMEM..*/.#if de
32e30 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20  fined(_MSC_VER) 
32e40 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20 31  && _MSC_VER >= 1
32e50 37 30 30 20 26 26 20 64 65 66 69 6e 65 64 28 5f  700 && defined(_
32e60 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61 20 6f  M_ARM).#pragma o
32e70 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 66 66 29  ptimize("", off)
32e80 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
32e90 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
32ea0 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ot(.  MemPage *p
32eb0 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
32ec0 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
32ed0 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73  page of siblings
32ee0 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20   being balanced 
32ef0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
32f00 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
32f10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
32f20 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20 70   "the page" in p
32f30 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a  Parent */.  u8 *
32f40 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20  aOvflSpace,     
32f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
32f60 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f  age-size bytes o
32f70 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72 65  f space for pare
32f80 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74  nt ovfl */.  int
32f90 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20 20 20   isRoot,        
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32fb0 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
32fc0 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a  is a root-page *
32fd0 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20 20 20  /.  int bBulk   
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ff0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
33000 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61 72 74  his call is part
33010 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64 20   of a bulk load 
33020 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
33030 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
33040 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
33050 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
33060 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33080 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
33090 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
330a0 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
330b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
330c0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
330d0 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
330e0 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
330f0 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20  nt nNew = 0;    
33100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
33110 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
33120 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
33130 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
33140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
33150 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
33160 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
33170 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
33180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
33190 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
331a0 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
331b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
331c0 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
331d0 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
331e0 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
331f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33210 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
33220 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65 63    u16 leafCorrec
33230 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
33240 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
33250 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
33260 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
33270 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
33280 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
33290 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
332a0 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
332b0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
332c0 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
332d0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
332e0 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
332f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
33300 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
33310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
33320 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
33330 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
33340 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
33350 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
33360 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
33370 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
33380 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
33390 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
333a0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
333b0 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
333c0 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ce1[] */.  int i
333d0 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20  OvflSpace = 0;  
333e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
333f0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
33400 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a  aOvflSpace[] */.
33410 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b    int szScratch;
33420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33430 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63  * Size of scratc
33440 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74  h memory request
33450 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ed */.  MemPage 
33460 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
33470 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
33480 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
33490 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ings */.  MemPag
334a0 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
334b0 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
334c0 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
334d0 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
334e0 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
334f0 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
33500 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
33510 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
33520 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
33530 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20  u8 *pRight;     
33540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33550 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65  Location in pare
33560 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c  nt of right-sibl
33570 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ing pointer */. 
33580 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d   u8 *apDiv[NB-1]
33590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
335a0 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   Divider cells i
335b0 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  n pParent */.  i
335c0 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b  nt cntNew[NB+2];
335d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
335e0 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20  ndex in aCell[] 
335f0 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d  of cell after i-
33600 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  th page */.  int
33610 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20   szNew[NB+2];   
33620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
33630 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65  bined size of ce
33640 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74  lls place on i-t
33650 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  h page */.  u8 *
33660 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  *apCell = 0;    
33670 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
33680 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61  cells begin bala
33690 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73  nced */.  u16 *s
336a0 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
336b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
336c0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
336d0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
336e0 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20  .  u8 *aSpace1; 
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33700 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70  /* Space for cop
33710 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
33720 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  cells */.  Pgno 
33730 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
33740 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
33750 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70  var to store a p
33760 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f  age number in */
33770 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e  ..  pBt = pParen
33780 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  t->pBt;.  assert
33790 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
337a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
337b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
337c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
337d0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
337e0 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20  DbPage) );..#if 
337f0 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  0.  TRACE(("BALA
33800 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20  NCE: begin page 
33810 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e  %d child of %d\n
33820 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
33830 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b  pParent->pgno));
33840 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74  .#endif..  /* At
33850 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72   this point pPar
33860 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74 20  ent may have at 
33870 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f  most one overflo
33880 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20  w cell. And if. 
33890 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   ** this overflo
338a0 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e  w cell is presen
338b0 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  t, it must be th
338c0 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a  e cell with .  *
338d0 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49  * index iParentI
338e0 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69  dx. This scenari
338f0 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68  o comes about wh
33900 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
33910 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
33920 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f  (indirectly) fro
33930 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  m sqlite3BtreeDe
33940 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  lete()..  */.  a
33950 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
33960 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
33970 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33980 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ow==1 );.  asser
33990 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
339a0 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
339b0 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d  ent->aiOvfl[0]==
339c0 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20  iParentIdx );.. 
339d0 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65   if( !aOvflSpace
339e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
339f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
33a00 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
33a10 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
33a20 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c   balance. Also l
33a30 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ocate the cells 
33a40 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a  in pParent .  **
33a50 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65   that divide the
33a60 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74   siblings. An at
33a70 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
33a80 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
33a90 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65  s on .  ** eithe
33aa0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  r side of pPage.
33ab0 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
33ac0 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
33ad0 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
33ae0 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20   .  ** if there 
33af0 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
33b00 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
33b10 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66  e other side. If
33b20 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
33b30 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
33b40 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
33b50 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
33b60 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20  ent are taken.  
33b70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
33b80 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20  loop also drops 
33b90 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
33ba0 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  s from the paren
33bb0 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a  t page. This.  *
33bc0 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69  * way, the remai
33bd0 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63  nder of the func
33be0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61  tion does not ha
33bf0 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ve to deal with 
33c00 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  any.  ** overflo
33c10 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  w cells in the p
33c20 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63  arent page, sinc
33c30 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64  e if any existed
33c40 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20   they will.  ** 
33c50 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
33c60 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a  n removed..  */.
33c70 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
33c80 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
33c90 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
33ca0 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
33cb0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
33cc0 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c      assert( bBul
33cd0 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31  k==0 || bBulk==1
33ce0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72   );.    if( iPar
33cf0 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20  entIdx==0 ){    
33d00 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
33d10 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
33d20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61     }else if( iPa
33d30 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20  rentIdx==i ){.  
33d40 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 2b      nxDiv = i-2+
33d50 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  bBulk;.    }else
33d60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
33d70 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  bBulk==0 );.    
33d80 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e    nxDiv = iParen
33d90 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  tIdx-1;.    }.  
33da0 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20    i = 2-bBulk;. 
33db0 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b   }.  nOld = i+1;
33dc0 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d  .  if( (i+nxDiv-
33dd0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33de0 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ow)==pParent->nC
33df0 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ell ){.    pRigh
33e00 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44  t = &pParent->aD
33e10 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
33e20 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c  Offset+8];.  }el
33e30 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d  se{.    pRight =
33e40 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
33e50 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
33e60 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
33e70 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74    }.  pgno = get
33e80 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20  4byte(pRight);. 
33e90 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
33ea0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
33eb0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
33ec0 26 61 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20  &apOld[i], 0);. 
33ed0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
33ee0 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c     memset(apOld,
33ef0 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66   0, (i+1)*sizeof
33f00 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
33f10 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
33f20 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
33f30 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
33f40 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
33f50 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
33f60 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28  rflow;.    if( (
33f70 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  i--)==0 ) break;
33f80 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69  ..    if( i+nxDi
33f90 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76  v==pParent->aiOv
33fa0 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65 6e 74  fl[0] && pParent
33fb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
33fc0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
33fd0 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b  pParent->apOvfl[
33fe0 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  0];.      pgno =
33ff0 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
34000 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
34010 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
34020 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
34030 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72  [i]);.      pPar
34040 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ent->nOverflow =
34050 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
34060 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
34070 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
34080 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
34090 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  t->nOverflow);. 
340a0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
340b0 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
340c0 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
340d0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
340e0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
340f0 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20  ..      /* Drop 
34100 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  the cell from th
34110 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61  e parent page. a
34120 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f  pDiv[i] still po
34130 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ints to.      **
34140 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
34150 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65   the parent, eve
34160 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20  n though it has 
34170 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20  been dropped..  
34180 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73      ** This is s
34190 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70  afe because drop
341a0 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79  ping a cell only
341b0 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
341c0 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
341d0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c  our bytes of it,
341e0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
341f0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
34200 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
34210 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
34220 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
34230 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74  ll. So the point
34240 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  er is safe to us
34250 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72  e.      ** later
34260 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a   on.  .      **.
34270 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74        ** But not
34280 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 73 65   if we are in se
34290 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
342a0 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65 6c 65  . In secure-dele
342b0 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a  te mode,.      *
342c0 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29  * the dropCell()
342d0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76   routine will ov
342e0 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69  erwrite the enti
342f0 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72  re cell with zer
34300 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  oes..      ** In
34310 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70   this case, temp
34320 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65  orarily copy the
34330 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61   cell into the a
34340 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20  OvflSpace[].    
34350 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20    ** buffer. It 
34360 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f  will be copied o
34370 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e  ut again as soon
34380 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d   as the aSpace[]
34390 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a   buffer.      **
343a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   is allocated.  
343b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
343c0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
343d0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
343e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
343f0 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f 66  ff;..        iOf
34400 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  f = SQLITE_PTR_T
34410 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20  O_INT(apDiv[i]) 
34420 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  - SQLITE_PTR_TO_
34430 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  INT(pParent->aDa
34440 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ta);.        if(
34450 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29   (iOff+szNew[i])
34460 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c  >(int)pBt->usabl
34470 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
34480 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
34490 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
344a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70         memset(ap
344b0 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69  Old, 0, (i+1)*si
344c0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
344d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
344e0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
344f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
34500 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
34510 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66  (&aOvflSpace[iOf
34520 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  f], apDiv[i], sz
34530 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  New[i]);.       
34540 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61     apDiv[i] = &a
34550 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b  OvflSpace[apDiv[
34560 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  i]-pParent->aDat
34570 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a];.        }.  
34580 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70      }.      drop
34590 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
345a0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
345b0 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b  Overflow, szNew[
345c0 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  i], &rc);.    }.
345d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
345e0 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
345f0 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65  ple of 4 in orde
34600 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
34610 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
34620 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
34630 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
34640 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20  + 3)&~3;..  /*. 
34650 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
34660 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
34670 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
34680 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  k = pBt->pageSiz
34690 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e + ROUND8(sizeo
346a0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73  f(MemPage));.  s
346b0 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20  zScratch =.     
346c0 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
346d0 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
346f0 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
34700 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
34710 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20  of(u16)         
34720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34730 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   szCell */.     
34740 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  + pBt->pageSize 
34750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34770 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20   aSpace1 */.    
34780 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20   + k*nOld;      
34790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
347b0 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61  * Page copies (a
347c0 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65  pCopy) */.  apCe
347d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ll = sqlite3Scra
347e0 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72  tchMalloc( szScr
347f0 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61  atch ); .  if( a
34800 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
34810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
34820 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
34830 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
34840 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
34850 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
34860 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20  lls];.  aSpace1 
34870 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
34880 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
34890 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
348a0 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65  ALIGNMENT(aSpace
348b0 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  1) );..  /*.  **
348c0 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74   Load pointers t
348d0 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73  o all cells on s
348e0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64  ibling pages and
348f0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
34900 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  ls.  ** into the
34910 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20   local apCell[] 
34920 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70  array.  Make cop
34930 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  ies of the divid
34940 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
34950 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
34960 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d  d from aSpace1[]
34970 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
34980 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
34990 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
349a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
349b0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
349c0 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
349d0 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
349e0 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
349f0 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
34a00 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
34a10 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
34a20 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
34a30 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
34a40 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73  ace1[].  In this
34a50 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
34a60 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20  in apCell[] are 
34a70 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69  without.  ** chi
34a80 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66  ld pointers.  If
34a90 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
34aa0 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61  t leaves, then a
34ab0 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20  ll cell in.  ** 
34ac0 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65  apCell[] include
34ad0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
34ae0 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c    Either way, al
34af0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
34b00 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69  l[].  ** are ali
34b10 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65  ke..  **.  ** le
34b20 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34  afCorrection:  4
34b30 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
34b40 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65  eaf.  0 if pPage
34b50 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a   is not a leaf..
34b60 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44    **       leafD
34b70 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65  ata:  1 if pPage
34b80 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20   holds key+data 
34b90 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64  and pParent hold
34ba0 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a  s only keys..  *
34bb0 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  /.  leafCorrecti
34bc0 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c  on = apOld[0]->l
34bd0 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
34be0 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61  a = apOld[0]->ha
34bf0 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30  sData;.  for(i=0
34c00 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
34c10 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20      int limit;. 
34c20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72     .    /* Befor
34c30 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
34c40 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f   else, take a co
34c50 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f  py of the i'th o
34c60 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a  riginal sibling.
34c70 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20      ** The rest 
34c80 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
34c90 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
34ca0 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
34cb0 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  ather.    ** tha
34cc0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
34cd0 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
34ce0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
34cf0 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20  ll be in the.   
34d00 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
34d10 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
34d20 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
34d30 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
34d40 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
34d50 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61  &aSpace1[pBt->pa
34d60 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20  geSize + k*i];. 
34d70 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20     memcpy(pOld, 
34d80 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
34d90 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
34da0 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76  pOld->aData = (v
34db0 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20  oid*)&pOld[1];. 
34dc0 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e     memcpy(pOld->
34dd0 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
34de0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
34df0 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d  eSize);..    lim
34e00 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
34e10 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
34e20 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e  ;.    if( pOld->
34e30 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20  nOverflow>0 ){. 
34e40 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
34e50 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
34e60 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
34e70 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
34e80 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
34e90 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
34ea0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
34eb0 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
34ec0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
34ed0 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
34ee0 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20  ell[nCell]);.   
34ef0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
34f00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
34f10 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61 74 61  .      u8 *aData
34f20 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a   = pOld->aData;.
34f30 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61        u16 maskPa
34f40 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50  ge = pOld->maskP
34f50 61 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63  age;.      u16 c
34f60 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64  ellOffset = pOld
34f70 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
34f80 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
34f90 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
34fa0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
34fb0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
34fc0 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43         apCell[nC
34fd0 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76  ell] = findCellv
34fe0 32 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67  2(aData, maskPag
34ff0 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a  e, cellOffset, j
35000 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
35010 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
35020 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
35030 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20  ell[nCell]);.   
35040 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
35050 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20      }.    }     
35060 20 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c    .    if( i<nOl
35070 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61  d-1 && !leafData
35080 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20  ){.      u16 sz 
35090 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b  = (u16)szNew[i];
350a0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
350b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
350c0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
350d0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
350e0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
350f0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
35100 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20  ce1[iSpace1];.  
35110 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73      iSpace1 += s
35120 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
35130 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63   sz<=pBt->maxLoc
35140 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61  al+23 );.      a
35150 73 73 65 72 74 28 20 69 53 70 61 63 65 31 20 3c  ssert( iSpace1 <
35160 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65  = (int)pBt->page
35170 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65  Size );.      me
35180 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
35190 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
351a0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
351b0 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
351c0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73  ction;.      ass
351d0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
351e0 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f  ion==0 || leafCo
351f0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
35200 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
35210 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c  l] = szCell[nCel
35220 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74  l] - leafCorrect
35230 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
35240 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
35250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
35260 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
35270 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
35280 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  t( pOld->hdrOffs
35290 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  et==0 );.       
352a0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
352b0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
352c0 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
352d0 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
352e0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
352f0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
35300 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
35310 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
35320 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
35330 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[8], 4);.     
35340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35350 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
35360 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
35370 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
35380 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
35390 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
353a0 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20  allow any cells 
353b0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62  smaller than 4 b
353c0 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ytes. */.       
353d0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
353e0 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 4;.        }.
353f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
35400 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell++;.    }.  }
35410 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75  ..  /*.  ** Figu
35420 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65  re out the numbe
35430 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65  r of pages neede
35440 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43  d to hold all nC
35450 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20  ell cells..  ** 
35460 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65  Store this numbe
35470 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20  r in "k".  Also 
35480 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20  compute szNew[] 
35490 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74  which is the tot
354a0 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  al.  ** size of 
354b0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  all cells on the
354c0 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63   i-th page and c
354d0 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  ntNew[] which is
354e0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
354f0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74  in apCell[] of t
35500 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76  he cell that div
35510 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d  ides page i from
35520 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a   page i+1.  .  *
35530 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75  * cntNew[k] shou
35540 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a  ld equal nCell..
35550 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73    **.  ** Values
35560 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69   computed by thi
35570 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20  s block:.  **.  
35580 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20  **           k: 
35590 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  The total number
355a0 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65   of sibling page
355b0 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b  s.  **    szNew[
355c0 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20  i]: Spaced used 
355d0 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  on the i-th sibl
355e0 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20  ing page..  **  
355f0 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65   cntNew[i]: Inde
35600 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  x in apCell[] an
35610 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74  d szCell[] for t
35620 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  he first cell to
35630 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
35640 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20     the right of 
35650 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
35660 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62   page..  ** usab
35670 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20  leSpace: Number 
35680 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
35690 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65  e available on e
356a0 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a  ach sibling..  *
356b0 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65  * .  */.  usable
356c0 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61  Space = pBt->usa
356d0 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c  bleSize - 12 + l
356e0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
356f0 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d   for(subtotal=k=
35700 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
35710 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
35720 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  i<nMaxCells );. 
35730 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73     subtotal += s
35740 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20  zCell[i] + 2;.  
35750 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e    if( subtotal >
35760 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a   usableSpace ){.
35770 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d        szNew[k] =
35780 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65   subtotal - szCe
35790 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74  ll[i];.      cnt
357a0 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20  New[k] = i;.    
357b0 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
357c0 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73  { i--; }.      s
357d0 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20  ubtotal = 0;.   
357e0 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66     k++;.      if
357f0 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d  ( k>NB+1 ){ rc =
35800 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35810 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e  BKPT; goto balan
35820 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20  ce_cleanup; }.  
35830 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
35840 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
35850 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
35860 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
35870 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
35880 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
35890 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
358a0 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
358b0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
358c0 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
358d0 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
358e0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
358f0 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
35900 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
35910 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
35920 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
35930 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
35940 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
35950 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
35960 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
35970 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
35980 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
35990 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
359a0 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
359b0 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
359c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
359d0 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
359e0 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
359f0 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
35a00 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
35a10 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
35a20 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
35a30 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
35a40 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
35a50 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
35a60 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
35a70 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
35a80 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
35a90 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
35aa0 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
35ab0 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
35ac0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
35ad0 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
35ae0 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
35af0 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
35b00 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
35b10 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
35b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
35b30 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
35b40 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
35b50 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
35b60 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
35b70 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
35b80 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
35b90 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
35ba0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
35bb0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
35bc0 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
35bd0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
35be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
35bf0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
35c00 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
35c10 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
35c20 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20  ( szRight==0 .  
35c30 20 20 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20       || (!bBulk 
35c40 26 26 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  && szRight+szCel
35c50 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
35c60 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20  szCell[r]+2)) . 
35c70 20 20 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69     ){.      szRi
35c80 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
35c90 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
35ca0 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
35cb0 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
35cc0 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
35cd0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
35ce0 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
35cf0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
35d00 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
35d10 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
35d20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
35d30 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
35d40 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
35d50 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
35d60 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
35d70 30 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20  0) or pPage is. 
35d80 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f   ** a virtual ro
35d90 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74  ot page.  A virt
35da0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
35db0 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72   when the real r
35dc0 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73  oot.  ** page is
35dd0 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61   page 1 and we a
35de0 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c  re the only chil
35df0 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a  d of that page..
35e00 20 20 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45    **.  ** UPDATE
35e10 3a 20 20 54 68 65 20 61 73 73 65 72 74 28 29 20  :  The assert() 
35e20 62 65 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63  below is not nec
35e30 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 69 66  essarily true if
35e40 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
35e50 2a 2a 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  ** file is corru
35e60 70 74 2e 20 20 54 68 65 20 63 6f 72 72 75 70 74  pt.  The corrupt
35e70 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 65 74 65  ion will be dete
35e80 63 74 65 64 20 61 6e 64 20 72 65 70 6f 72 74 65  cted and reporte
35e90 64 20 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20  d later.  ** in 
35ea0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73  this procedure s
35eb0 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
35ec0 65 64 20 74 6f 20 61 63 74 20 75 70 6f 6e 20 69  ed to act upon i
35ed0 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20  t now..  */.#if 
35ee0 30 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  0.  assert( cntN
35ef0 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
35f00 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
35f10 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
35f20 30 29 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  0) );.#endif..  
35f30 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
35f40 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
35f50 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d  ",.    apOld[0]-
35f60 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64  >pgno, .    nOld
35f70 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e  >=2 ? apOld[1]->
35f80 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  pgno : 0,.    nO
35f90 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d  ld>=3 ? apOld[2]
35fa0 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b  ->pgno : 0.  ));
35fb0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
35fc0 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
35fd0 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
35fe0 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
35ff0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70  e..  */.  if( ap
36000 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20  Old[0]->pgno<=1 
36010 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
36020 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36030 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
36040 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
36050 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f   pageFlags = apO
36060 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b  ld[0]->aData[0];
36070 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
36080 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
36090 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
360a0 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
360b0 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
360c0 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
360d0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
360e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
360f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36100 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
36110 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
36120 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
36130 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
36140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36150 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
36160 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
36170 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
36180 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
36190 2c 20 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70  , (bBulk ? 1 : p
361a0 67 6e 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  gno), 0);.      
361b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
361c0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
361d0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
361e0 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
361f0 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
36200 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
36210 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
36220 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
36230 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
36240 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
36250 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
36260 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
36270 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
36280 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
36290 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
362a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
362b0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
362c0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
362d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
362e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
362f0 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
36300 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
36310 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
36320 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
36330 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
36340 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  {.    freePage(a
36350 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  pOld[i], &rc);. 
36360 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
36370 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
36380 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
36390 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
363a0 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
363b0 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
363c0 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
363d0 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
363e0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
363f0 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
36400 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
36410 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
36420 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
36430 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
36440 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
36450 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
36460 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
36470 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
36480 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
36490 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
364a0 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
364b0 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
364c0 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
364d0 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
364e0 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
364f0 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
36500 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
36510 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
36520 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
36530 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
36540 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
36550 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
36560 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
36570 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
36580 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
36590 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
365a0 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
365b0 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
365c0 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
365d0 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
365e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
365f0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
36600 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
36610 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
36620 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
36630 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
36640 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
36650 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
36660 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
36670 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
36680 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
36690 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
366a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
366b0 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
366c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
366d0 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
366e0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  [i];.      apNew
366f0 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
36700 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  ];.      apNew[m
36710 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
36720 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e  .  }.  TRACE(("n
36730 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
36740 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
36750 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61  %d(%d)\n",.    a
36760 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73  pNew[0]->pgno, s
36770 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
36780 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d  w>=2 ? apNew[1]-
36790 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
367a0 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
367b0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
367c0 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20   apNew[2]->pgno 
367d0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
367e0 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
367f0 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77   nNew>=4 ? apNew
36800 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [3]->pgno : 0, n
36810 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
36820 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
36830 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70  =5 ? apNew[4]->p
36840 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  gno : 0, nNew>=5
36850 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
36860 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
36870 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36880 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
36890 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74  DbPage) );.  put
368a0 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70  4byte(pRight, ap
368b0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
368c0 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  o);..  /*.  ** E
368d0 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
368e0 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
368f0 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
36900 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
36910 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
36920 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
36930 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
36940 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
36950 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
36960 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
36970 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
36980 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
36990 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
369a0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
369b0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
369c0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65  xCells );.    ze
369d0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
369e0 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73  eFlags);.    ass
369f0 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
36a00 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
36a10 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
36a20 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
36a30 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
36a40 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
36a50 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
36a60 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
36a70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
36a80 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  ;..    j = cntNe
36a90 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
36aa0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
36ab0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
36ac0 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
36ad0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
36ae0 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
36af0 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
36b00 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
36b10 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
36b20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31  assert( i<nNew-1
36b30 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a   || j==nCell );.
36b40 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20      if( j<nCell 
36b50 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
36b60 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
36b70 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
36b80 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
36b90 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
36ba0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
36bb0 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
36bc0 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
36bd0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
36be0 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
36bf0 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c  aOvflSpace[iOvfl
36c00 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66  Space];.      if
36c10 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
36c20 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
36c30 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
36c40 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
36c50 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
36c60 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
36c70 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
36c80 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
36c90 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
36ca0 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
36cb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
36cc0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
36cd0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
36ce0 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
36cf0 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
36d00 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
36d10 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
36d20 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
36d30 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
36d40 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
36d50 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
36d60 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
36d70 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
36d80 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
36d90 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
36da0 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62    j--;.        b
36db0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
36dc0 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
36dd0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
36de0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
36df0 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20  .        sz = 4 
36e00 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  + putVarint(&pCe
36e10 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll[4], info.nKey
36e20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
36e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
36e40 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
36e50 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
36e60 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
36e70 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
36e80 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
36e90 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
36ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
36eb0 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
36ec0 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
36ed0 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
36ee0 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
36ef0 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
36f00 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
36f10 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
36f20 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
36f30 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73  * (see btreePars
36f40 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
36f50 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
36f60 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
36f70 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
36f80 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
36f90 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
36fa0 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
36fb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
36fc0 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
36fd0 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
36fe0 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
36ff0 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
37000 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
37010 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
37020 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
37030 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
37040 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
37050 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
37060 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
37070 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
37080 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
37090 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
370a0 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
370b0 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
370c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
370d0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
370e0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
370f0 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
37100 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
37110 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
37120 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
37130 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
37140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
37150 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a  vflSpace += sz;.
37160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
37170 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
37180 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
37190 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 20 3c  rt( iOvflSpace <
371a0 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65  = (int)pBt->page
371b0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e  Size );.      in
371c0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
371d0 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
371e0 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d  sz, pTemp, pNew-
371f0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
37200 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37210 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
37220 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
37230 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
37240 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37250 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
37260 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a  age) );..      j
37270 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b  ++;.      nxDiv+
37280 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
37290 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20  ssert( j==nCell 
372a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c  );.  assert( nOl
372b0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
372c0 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28   nNew>0 );.  if(
372d0 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54   (pageFlags & PT
372e0 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20  F_LEAF)==0 ){.  
372f0 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26    u8 *zChild = &
37300 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
37310 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65  aData[8];.    me
37320 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
37330 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a  -1]->aData[8], z
37340 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a  Child, 4);.  }..
37350 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20    if( isRoot && 
37360 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
37370 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64  0 && pParent->hd
37380 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30  rOffset<=apNew[0
37390 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  ]->nFree ){.    
373a0 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
373b0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
373c0 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ow contains no c
373d0 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73  ells. The only s
373e0 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61  ibling.    ** pa
373f0 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ge is the right-
37400 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72  child of the par
37410 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f  ent. Copy the co
37420 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
37430 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20    ** child page 
37440 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c  into the parent,
37450 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65 20   decreasing the 
37460 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f  overall height o
37470 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74  f the.    ** b-t
37480 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62 79  ree structure by
37490 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65   one. This is de
374a0 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20 22  scribed as the "
374b0 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65  balance-shallowe
374c0 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c  r".    ** sub-al
374d0 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20  gorithm in some 
374e0 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20  documentation.. 
374f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
37500 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
37510 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
37520 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70   the call to cop
37530 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a  yNodeContent() .
37540 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20      ** sets all 
37550 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
37560 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
37570 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d  g to database im
37580 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
37590 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  * for which the 
375a0 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65  pointer is store
375b0 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e  d within the con
375c0 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65  tent being copie
375d0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
375e0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65   The second asse
375f0 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  rt below verifie
37600 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c 64  s that the child
37610 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d   page is defragm
37620 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74  ented.    ** (it
37630 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74 20   must be, as it 
37640 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74  was just reconst
37650 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73 73  ructed using ass
37660 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68  emblePage()). Th
37670 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70  is.    ** is imp
37680 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70 61  ortant if the pa
37690 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e  rent page happen
376a0 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f  s to be page 1 o
376b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
376c0 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f     ** image.  */
376d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65  .    assert( nNe
376e0 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  w==1 );.    asse
376f0 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  rt( apNew[0]->nF
37700 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20  ree == .        
37710 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 77  (get2byte(&apNew
37720 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61  [0]->aData[5])-a
37730 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66  pNew[0]->cellOff
37740 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43  set-apNew[0]->nC
37750 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20  ell*2) .    );. 
37760 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65     copyNodeConte
37770 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61  nt(apNew[0], pPa
37780 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20  rent, &rc);.    
37790 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30  freePage(apNew[0
377a0 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65  ], &rc);.  }else
377b0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
377c0 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20  M ){.    /* Fix 
377d0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
377e0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
377f0 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77  the cells that w
37800 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f 75  ere shifted arou
37810 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72  nd. .    ** Ther
37820 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64 69  e are several di
37830 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
37840 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37850 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ries that need t
37860 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  o.    ** be deal
37870 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20 72  t with by this r
37880 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20  outine. Some of 
37890 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e 20  these have been 
378a0 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74  set already, but
378b0 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76  .    ** many hav
378c0 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f  e not. The follo
378d0 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72  wing is a summar
378e0 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y:.    **.    **
378f0 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69 65     1) The entrie
37900 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
37910 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  h new sibling pa
37920 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
37930 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69  t.    **      si
37940 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73  blings when this
37950 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
37960 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76 65  lled. These have
37970 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
37980 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57       been set. W
37990 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
379a0 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20  worry about old 
379b0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
379c0 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d  re.    **      m
379d0 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
379e0 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65 65  -list - the free
379f0 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73 20  Page() code has 
37a00 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a  taken care.    *
37a10 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e  *      of those.
37a20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
37a30 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d   2) The pointer-
37a40 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
37a50 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
37a60 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20  first overflow. 
37a70 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20     **      page 
37a80 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  in any overflow 
37a90 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e  chains used by n
37aa0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ew divider cells
37ab0 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20  . These .    ** 
37ac0 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61       have also a
37ad0 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65  lready been take
37ae0 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68 65  n care of by the
37af0 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f   insertCell() co
37b00 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
37b10 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73 69  *   3) If the si
37b20 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
37b30 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
37b40 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
37b50 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   of.    **      
37b60 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20  cells stored on 
37b70 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
37b80 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
37b90 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
37ba0 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20  .    **   4) If 
37bb0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
37bc0 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e  s are not intern
37bd0 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c  al intkey nodes,
37be0 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a   then any.    **
37bf0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
37c00 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ages used by the
37c10 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65  se cells may nee
37c20 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a  d to be updated.
37c30 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74      **      (int
37c40 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
37c50 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  es never contain
37c60 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65   pointers to ove
37c70 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20  rflow pages)..  
37c80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29    **.    **   5)
37c90 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
37ca0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
37cb0 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70  aves, then the p
37cc0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
37cd0 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 66  *      entries f
37ce0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  or the right-chi
37cf0 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63 68  ld pages of each
37d00 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65   sibling may nee
37d10 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f  d.    **      to
37d20 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
37d30 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73   **.    ** Cases
37d40 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65 61   1 and 2 are dea
37d50 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62 79  lt with above by
37d60 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65   other code. The
37d70 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
37d80 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63 61  ck deals with ca
37d90 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20  ses 3 and 4 and 
37da0 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68  the one after th
37db0 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63  at, case 5. Sinc
37dc0 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  e.    ** setting
37dd0 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65   a pointer map e
37de0 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74 69  ntry is a relati
37df0 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f  vely expensive o
37e00 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20  peration, this. 
37e10 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20     ** code only 
37e20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70  sets pointer map
37e30 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69   entries for chi
37e40 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ld or overflow p
37e50 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
37e60 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d     ** actually m
37e70 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61 67  oved between pag
37e80 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  es.  */.    MemP
37e90 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
37ea0 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67  w[0];.    MemPag
37eb0 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
37ec0 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76  [0];.    int nOv
37ed0 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
37ee0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e  Overflow;.    in
37ef0 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c  t iNextOld = pOl
37f00 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72  d->nCell + nOver
37f10 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f  flow;.    int iO
37f20 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72  verflow = (nOver
37f30 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f  flow ? pOld->aiO
37f40 76 66 6c 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20 20  vfl[0] : -1);.  
37f50 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20    j = 0;        
37f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f70 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
37f80 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61  'old' sibling pa
37f90 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b  ge */.    k = 0;
37fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37fc0 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69  Current 'new' si
37fd0 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
37fe0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
37ff0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
38000 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d 20  int isDivider = 
38010 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
38020 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20  i==iNextOld ){. 
38030 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69         /* Cell i
38040 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d   is the cell imm
38050 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
38060 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  ng the last cell
38070 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20   on old.        
38080 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  ** sibling page 
38090 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  j. If the siblin
380a0 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20  gs are not leaf 
380b0 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20  pages of an.    
380c0 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d      ** intkey b-
380d0 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20  tree, then cell 
380e0 69 20 77 61 73 20 61 20 64 69 76 69 64 65 72 20  i was a divider 
380f0 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
38100 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20 41   assert( j+1 < A
38110 72 72 61 79 53 69 7a 65 28 61 70 43 6f 70 79 29  rraySize(apCopy)
38120 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
38130 72 74 28 20 6a 2b 31 20 3c 20 6e 4f 6c 64 20 29  rt( j+1 < nOld )
38140 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d  ;.        pOld =
38150 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20   apCopy[++j];.  
38160 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d        iNextOld =
38170 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
38180 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70   pOld->nCell + p
38190 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
381a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
381b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
381c0 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c           nOverfl
381d0 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
381e0 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  flow;.          
381f0 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20  iOverflow = i + 
38200 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
38210 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20  ->aiOvfl[0];.   
38220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
38230 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66  sDivider = !leaf
38240 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a  Data;  .      }.
38250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
38260 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76  verflow>0 || iOv
38270 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20  erflow<i );.    
38280 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
38290 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69  ow<2 || pOld->ai
382a0 4f 76 66 6c 5b 30 5d 3d 3d 70 4f 6c 64 2d 3e 61  Ovfl[0]==pOld->a
382b0 69 4f 76 66 6c 5b 31 5d 2d 31 29 3b 0a 20 20 20  iOvfl[1]-1);.   
382c0 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
382d0 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61  low<3 || pOld->a
382e0 69 4f 76 66 6c 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e  iOvfl[1]==pOld->
382f0 61 69 4f 76 66 6c 5b 32 5d 2d 31 29 3b 0a 20 20  aiOvfl[2]-1);.  
38300 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72      if( i==iOver
38310 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
38320 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20  isDivider = 1;. 
38330 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f         if( (--nO
38340 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20  verflow)>0 ){.  
38350 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
38360 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w++;.        }. 
38370 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
38380 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29  ( i==cntNew[k] )
38390 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
383a0 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
383b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
383c0 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
383d0 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20  ell on new.     
383e0 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
383f0 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62  ge k. If the sib
38400 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
38410 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
38420 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
38430 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
38440 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65  ll i is a divide
38450 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20  r cell.  */.    
38460 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
38470 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++k];.        i
38480 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63  f( !leafData ) c
38490 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20