/ Hex Artifact Content
Login

Artifact 58c4d68415ca7b13a501b682a9c0ad1e287bcacb:


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 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4d10: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4d20: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4d30: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4d40: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4d50: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4d60: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
4d70: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
4d80: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
4d90: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4da0: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
4db0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
4dc0: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
4dd0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
4de0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
4df0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
4e00: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
4e10: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
4e20: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
4e30: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
4e40: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
4e50: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
4e60: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
4e70: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
4e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
4e90: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
4ea0: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
4eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
4ec0: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
4ed0: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
4ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4ef0: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
4f00: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
4f10: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
4f20: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
4f30: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
4f40: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
4f50: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
4f60: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
4f70: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
4f80: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
4f90: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
4fa0: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
4fb0: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
4fc0: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
4fd0: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
4fe0: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
4ff0: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
5000: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
5010: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
5020: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
5030: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
5040: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50  if( 0==pCur->apP
5050: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
5060: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
5070: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
5080: 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  ( (int)pCur->nKe
5090: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
50a0: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
50b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
50c0: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
50d0: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
50e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
50f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5100: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5110: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
5120: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5130: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
5140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5150: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
5160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5170: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5180: 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
5190: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
51a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
51b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
51c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
51d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
51e0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
51f0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
5200: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
5210: 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  i]);.      pCur-
5220: 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
5230: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
5240: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  iPage = -1;.    
5250: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5260: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5270: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5280: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5290: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
52a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
52b0: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
52c0: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
52d0: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
52e0: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
52f0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
5300: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5310: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
5320: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
5330: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5340: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
5350: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
5360: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
5370: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5380: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
5390: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
53a0: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
53b0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
53c0: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
53d0: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
53e0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
53f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5400: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
5420: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
5430: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
5440: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
5450: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5460: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
5470: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
5480: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
5490: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
54a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
54b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
54c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
54d0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
54e0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
54f0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5500: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
5510: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
5520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5530: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5540: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5550: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5560: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
5570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
5580: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5590: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
55a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
55b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
55c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
55d0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
55e0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
55f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5600: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
5610: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
5620: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
5630: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
5640: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
5650: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
5660: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
5670: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
5680: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5690: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
56a0: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
56b0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
56c0: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
56d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
56e0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
56f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
5700: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
5710: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
5720: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
5730: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
5740: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
5750: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
5760: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5770: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5780: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5790: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
57a0: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
57b0: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
57c0: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
57d0: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
57e0: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
57f0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
5800: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
5810: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
5820: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
5830: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5850: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
5860: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5870: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5880: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5890: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
58a0: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
58b0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
58c0: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
58d0: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
58e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
58f0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
5900: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5910: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5920: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5930: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5940: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
5950: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
5960: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5970: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
5980: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
5990: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
59a0: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
59b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
59c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
59d0: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
59e0: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
59f0: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
5a00: 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xKey);.  }else{.
5a10: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
5a20: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5a30: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
5a40: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
5a50: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
5a60: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
5a70: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
5a80: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
5a90: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
5aa0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
5ab0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5ac0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5ad0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5ae0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5af0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5b00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5b10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5b20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5b30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
5b40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
5b50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
5b60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
5b70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
5b80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
5b90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5ba0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5bb0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5bc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5bd0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5be0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5bf0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5c00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5c10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5c20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5c30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5c40: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5c50: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5c60: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5c70: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5c80: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
5c90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5ca0: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5cb0: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5cc0: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5cd0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5ce0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5cf0: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5d00: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5d10: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5d20: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5d30: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5d40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5d60: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5d70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5d80: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5d90: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5da0: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5db0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5dc0: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5dd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5de0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5df0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5e00: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5e10: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5e20: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5e30: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5e40: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5e50: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5e60: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5e70: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5e80: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5e90: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5ea0: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5eb0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5ec0: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5ed0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5ee0: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5ef0: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5f00: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5f10: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5f20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5f30: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5f40: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5f50: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5f60: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5f70: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5f80: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5f90: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5fa0: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5fb0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5fc0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5fd0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5fe0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5ff0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
6000: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6010: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
6020: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
6030: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
6040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6050: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6060: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6070: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
6080: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
6090: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
60a0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
60b0: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
60c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
60d0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
60e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
60f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
6100: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
6110: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
6120: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
6130: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
6140: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
6150: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
6160: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
6170: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
6180: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
6190: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
61a0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
61b0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
61c0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
61d0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
61e0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
61f0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
6200: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
6210: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
6220: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
6230: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
6240: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
6250: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
6260: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
6270: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
6280: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
6290: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
62a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
62b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
62c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
62d0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
62e0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
62f0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6300: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6310: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6320: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6330: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
6340: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
6350: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
6360: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
6370: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
6380: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
6390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
63a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
63b0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
63c0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
63d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
63e0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
63f0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6400: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6410: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6420: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6430: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
6440: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6450: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
6460: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
6470: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
6480: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
6490: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
64a0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
64b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
64c0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
64d0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
64e0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
64f0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6500: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6510: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6520: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6530: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
6540: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
6550: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
6560: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6570: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
6580: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
6590: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
65a0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
65b0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
65c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
65d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
65e0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
65f0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6600: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6610: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6630: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
6640: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
6650: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
6660: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
6670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6680: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6690: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
66a0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
66b0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
66c0: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
66d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
66e0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
66f0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6700: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6710: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6720: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6730: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
6740: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
6750: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6760: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
6770: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
6780: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6790: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
67a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
67b0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
67c0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
67d0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
67e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
67f0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6800: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6810: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6820: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6830: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
6840: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
6850: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6860: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6870: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6880: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6890: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
68a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
68b0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
68c0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
68d0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
68e0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
68f0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6900: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6910: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6920: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
6930: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
6940: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
6950: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
6960: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
6970: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
6980: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6990: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
69a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
69b0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
69c0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
69d0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
69e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
69f0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6a00: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6a10: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6a20: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
6a40: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6a50: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
6a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6a70: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
6a80: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6a90: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6aa0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6ab0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6ac0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6ad0: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6ae0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6af0: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6b00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6b10: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6b20: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
6b30: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
6b40: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
6b50: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b60: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
6b70: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
6b80: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6b90: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6ba0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6bb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6bc0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6bd0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6be0: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6bf0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6c00: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6c10: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6c20: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6c30: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
6c40: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
6c50: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
6c60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6c70: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6c80: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6c90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6ca0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6cc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6cd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6ce0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6cf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6d00: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6d10: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6d20: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6d30: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6d40: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6d50: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6d60: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6d70: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6d80: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6d90: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6da0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6db0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6dc0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6dd0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6de0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6df0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6e00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6e10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6e20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6e30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6e40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6e50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6e60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6e70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6e80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6ea0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ec0: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6ed0: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6ee0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6ef0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f00: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6f10: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f20: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6f30: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6f40: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6f50: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6f60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6f70: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6f80: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6f90: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6fa0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6fb0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6fc0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6fd0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6fe0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6ff0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
7000: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
7010: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
7020: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
7030: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
7040: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
7050: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
7060: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
7070: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
7080: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
7090: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43  et2byte(&(P)->aC
70a0: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
70b0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
70c0: 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b  lv2(D,M,O,I) (D+
70d0: 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f  (M&get2byte(D+(O
70e0: 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a  +2*(I))))).../*.
70f0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
7100: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
7110: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
7120: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
7130: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
7140: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7150: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
7160: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
7170: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
7180: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
7190: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
71a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
71b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
71c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
71d0: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
71e0: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
71f0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
7200: 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69     k = pPage->ai
7210: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Ovfl[i];.    if(
7220: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
7230: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
7240: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7250: 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
7260: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
7270: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
7280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
7290: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
72a0: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
72b0: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
72c0: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
72d0: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
72e0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
72f0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
7300: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
7310: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65   function.  btre
7320: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
7330: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
7340: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
7350: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62  d argument and b
7360: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7370: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
7380: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
7390: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
73a0: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
73b0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
73c0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
73d0: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
73e0: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
73f0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
7400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7410: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
7420: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
7430: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
7440: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7450: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7460: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
7470: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7480: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7490: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
74a0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
74b0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
74c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
74d0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
74e0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
74f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7500: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7510: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
7520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7530: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
7540: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
7550: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
7560: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
7570: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7580: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
7590: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
75a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
75b0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
75c0: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
75d0: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
75e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
75f0: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
7600: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
7610: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
7620: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
7630: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
7640: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
7650: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
7660: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7670: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7680: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7690: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
76a0: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
76b0: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
76c0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
76d0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
76e0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
76f0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
7700: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7710: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7720: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
7730: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
7740: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7750: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7760: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
7770: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
7780: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
7790: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
77a0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
77b0: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73  eader = n;.  tes
77c0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
77d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
77e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
77f0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
7800: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
7810: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
7820: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
7830: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
7840: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
7850: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
7860: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
7870: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
7880: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
7890: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
78a0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
78b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
78c0: 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d   (pInfo->nSize =
78d0: 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61   (u16)(n+nPayloa
78e0: 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  d))<4 ) pInfo->n
78f0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
7900: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7910: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
7920: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7930: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
7940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
7950: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
7960: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
7970: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
7980: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
7990: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
79a0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
79b0: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
79c0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
79d0: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
79e0: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
79f0: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
7a00: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
7a10: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
7a20: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
7a30: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
7a40: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
7a50: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
7a60: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
7a70: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
7a80: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
7a90: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
7aa0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
7ab0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
7ac0: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
7ad0: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
7ae0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
7af0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
7b00: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
7b10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
7b20: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
7b30: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
7b40: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b50: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7b60: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
7b70: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
7b80: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b90: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7ba0: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
7bb0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
7bc0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
7bd0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
7be0: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
7bf0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
7c00: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
7c10: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
7c20: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
7c30: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
7c40: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
7c50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7c60: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7c70: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7c80: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
7c90: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72     testcase( sur
7ca0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
7cb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70   );.    if( surp
7cc0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
7cd0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
7ce0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
7cf0: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
7d00: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
7d20: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7d30: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d40: 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d  w = (u16)(pInfo-
7d50: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20  >nLocal + n);.  
7d60: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7d70: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d80: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
7d90: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
7da0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
7db0: 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72  fo) \.  btreePar
7dc0: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
7dd0: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
7de0: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
7df0: 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76  pInfo)).static v
7e00: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7e10: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
7e20: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7e30: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7e40: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
7e50: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
7e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
7e70: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
7e80: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
7e90: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
7eb0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
7ec0: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
7ed0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7ee0: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
7ef0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
7f00: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
7f10: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
7f20: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
7f30: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
7f40: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
7f50: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
7f60: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
7f70: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7f80: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
7f90: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
7fa0: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
7fb0: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
7fc0: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
7fd0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
7ff0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
8000: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8010: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
8020: 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61  ter = &pCell[pPa
8030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8040: 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  ];.  u32 nSize;.
8050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8060: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
8070: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
8080: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
8090: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
80a0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
80b0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
80c0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
80d0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
80e0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
80f0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
8100: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
8110: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
8120: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
8130: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
8140: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
8150: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
8160: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
8170: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
8180: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8190: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
81a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
81b0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
81c0: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
81d0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
81e0: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
81f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
8200: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
8210: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
8220: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
8230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
8240: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
8250: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
8260: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
8270: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
8280: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
8290: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
82a0: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
82b0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
82c0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
82d0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
82e0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
82f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8300: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
8310: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
8320: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
8330: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
8340: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
8350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8360: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8370: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8380: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  ;.  }..  testcas
8390: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
83a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
83b0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
83c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
83d0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
83e0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
83f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   ){.    int minL
8400: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8410: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
8420: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
8430: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
8440: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
8450: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
8460: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8470: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8480: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
8490: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
84a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
84b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
84c0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
84d0: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
84e0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
84f0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
8500: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
8510: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
8520: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
8530: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
8540: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
8550: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
8560: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
8570: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
8580: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
8590: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
85a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
85b0: 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65  )nSize;.}..#ifde
85c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
85d0: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
85e0: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
85f0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
8600: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8610: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
8620: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
8630: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
8640: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8650: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
8660: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
8670: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8680: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
8690: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
86a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
86b0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
86c0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
86d0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
86e0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
86f0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
8700: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
8710: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
8720: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
8730: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
8740: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
8750: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8760: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
8770: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
8780: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
8790: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
87a0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
87b0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
87c0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65  ell!=0 );.  btre
87d0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
87e0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
87f0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
8800: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
8810: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
8820: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
8830: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
8840: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
8850: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
8860: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
8870: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
8880: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
8890: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
88a0: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
88b0: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
88c0: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
88d0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
88e0: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
88f0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
8900: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
8910: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
8920: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
8930: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
8940: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8950: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8960: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8970: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
8980: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
8990: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
89a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
89b0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
89c0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
89d0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
89e0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8a10: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8a40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8a50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8a70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
8a80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
8a90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
8aa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8ab0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
8ac0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
8ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8ae0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
8af0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
8b00: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
8b10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8b20: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8b30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
8b40: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8b70: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8b80: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
8b90: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
8ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8bb0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
8bc0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
8bd0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8be0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8bf0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8c00: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8c10: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8c20: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8c30: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8c40: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8c50: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8c60: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
8c80: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
8c90: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
8ca0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
8cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8cc0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8cd0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8ce0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8cf0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8d10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8d20: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8d30: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8d40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8d50: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8d60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8d70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8d80: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8d90: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
8da0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
8db0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
8dc0: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
8dd0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8de0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8df0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8e00: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8e10: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8e20: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8e30: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8e40: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8e50: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8e60: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8e70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8e80: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
8e90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8ea0: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
8eb0: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
8ec0: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
8ed0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8ee0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8ef0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8f00: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8f10: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8f20: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8f30: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8f40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8f50: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8f60: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8f70: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8f80: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
8f90: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
8fa0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
8fb0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
8fc0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8fd0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8fe0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8ff0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
9000: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9010: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9020: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
9030: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
9040: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9050: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
9060: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
9070: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
9080: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9090: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
90a0: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
90b0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
90c0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
90d0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
90e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
90f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9100: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9110: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9120: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
9130: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
9140: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9150: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
9160: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9170: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9180: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9190: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
91a0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
91b0: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
91c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91e0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
91f0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
9200: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
9210: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9230: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9240: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9250: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9260: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9270: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9280: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9290: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
92a0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
92b0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
92c0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
92d0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
92e0: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
92f0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
9300: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
9310: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
9320: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
9330: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
9340: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
9350: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
9360: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
9370: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
9380: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9390: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
93a0: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
93b0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
93c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93d0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93e0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93f0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
9400: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
9410: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
9420: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9430: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9450: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
9460: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
9470: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
9480: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9490: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
94a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
94b0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
94c0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
94d0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
94e0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
94f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
9500: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
9510: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
9520: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
9530: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
9540: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
9550: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
9560: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
9570: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
9580: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9590: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
95a0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
95b0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
95c0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
95d0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
95e0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
95f0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
9600: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
9610: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
9620: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
9630: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
9640: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
9650: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
9660: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
9670: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
9680: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
9690: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
96a0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
96b0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
96c0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
96d0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
96e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
96f0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
9700: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9710: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
9720: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
9730: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
9740: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
9750: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
9760: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
9770: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
9780: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9790: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
97a0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
97b0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
97c0: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
97f0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
9800: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
9810: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9840: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9850: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9860: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9870: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
9880: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
9890: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
98a0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
98b0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
98c0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
98d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
98e0: 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
98f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
9900: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
9910: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9920: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9930: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9940: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9950: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9970: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9980: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9990: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
99a0: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
99b0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
99c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
99d0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
99e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
99f0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9a00: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
9a10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9a20: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
9a30: 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a  Byte < usableSiz
9a40: 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20  e-8 );..  nFrag 
9a50: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
9a60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a70: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
9a80: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
9a90: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
9aa0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9ab0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
9ac0: 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65  Cell;.  top = ge
9ad0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9ae0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
9af0: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
9b00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9b10: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
9b20: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
9b30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9b40: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
9b50: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9b60: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9b70: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9b80: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9b90: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9ba0: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9bb0: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9bc0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9bd0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9be0: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9bf0: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9c00: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c10: 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c  }else if( gap+2<
9c20: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =top ){.    /* S
9c30: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
9c40: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9c50: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9c60: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9c70: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
9c80: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
9c90: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
9ca0: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
9cb0: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
9cc0: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
9cd0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
9ce0: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
9cf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
9d00: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
9d10: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
9d20: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
9d30: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
9d40: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
9d50: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
9d60: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9d70: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
9d80: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
9d90: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61  leSize-4 || pc<a
9da0: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  ddr+4 ){.       
9db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9dc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9dd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20     }.      size 
9de0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9df0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
9e00: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
9e10: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
9e20: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
9e30: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9e40: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
9e50: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
9e60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9e70: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x<4 ){.         
9e80: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
9e90: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
9ea0: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
9eb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
9ec0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
9ed0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
9ee0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
9ef0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9f00: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61  &data[addr], &da
9f10: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
9f20: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
9f30: 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b  ] = (u8)(nFrag +
9f40: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   x);.        }el
9f50: 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e  se if( size+pc >
9f60: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
9f70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9f80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f90: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
9fa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
9fb0: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
9fc0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
9fd0: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
9fe0: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
9ff0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
a000: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
a010: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
a020: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
a030: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a040: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
a050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a060: 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b   *pIdx = pc + x;
a070: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
a090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a0a0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
a0b0: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65   sure there is e
a0c0: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74  nough space in t
a0d0: 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66  he gap to satisf
a0e0: 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63  y.  ** the alloc
a0f0: 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20  ation.  If not, 
a100: 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f  defragment..  */
a110: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a120: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
a130: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
a140: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63  te>top ){.    rc
a150: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
a160: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
a170: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a180: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a190: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
a1a0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
a1b0: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
a1c0: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
a1d0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
a1e0: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
a1f0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a200: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a210: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
a220: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a230: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
a240: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
a250: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
a260: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
a270: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
a280: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
a290: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
a2a0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
a2b0: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
a2c0: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
a2d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a2e0: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
a2f0: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
a300: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
a310: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
a320: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
a330: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
a340: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
a360: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
a370: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a380: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
a390: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
a3a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a3b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
a3c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
a3d0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
a3e0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
a3f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a400: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
a410: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
a420: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
a430: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a440: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
a450: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
a460: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
a470: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
a480: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
a490: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
a4a0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
a4b0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
a4c0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
a4d0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
a4e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a4f0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a500: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a510: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74  egin, hdr;.  int
a520: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a540: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
a550: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
a560: 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  set */.  unsigne
a570: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
a580: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
a590: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a5a0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a5b0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a5c0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a5d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a5e0: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
a5f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
a600: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
a610: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
a620: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
a630: 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  ) <= (int)pPage-
a640: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a660: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a670: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a680: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a690: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
a6a0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
a6b0: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66  ze is 4 */..  if
a6c0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
a6d0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
a6e0: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
a6f0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
a700: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
a710: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
a720: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
a730: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
a740: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
a750: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
a760: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a770: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
a780: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
a790: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
a7a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
a7b0: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
a7c0: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
a7d0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
a7e0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
a7f0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
a800: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
a810: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
a820: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
a830: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
a840: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
a850: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
a860: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
a870: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
a880: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
a890: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
a8a0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a8b0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
a8c0: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
a8d0: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
a8e0: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
a8f0: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
a900: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
a910: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a920: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
a930: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
a940: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
a950: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
a960: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
a970: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
a980: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
a990: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
a9a0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
a9b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a9c0: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
a9d0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
a9e0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
a9f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
aa00: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
aa10: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
aa20: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
aa30: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
aa40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
aa50: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
aa60: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
aa70: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
aa80: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
aa90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
aaa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
aab0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
aac0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
aad0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
aae0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
aaf0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ab00: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
ab10: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ab20: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ab30: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
ab40: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
ab50: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
ab60: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
ab70: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
ab80: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
ab90: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
aba0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
abb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
abc0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
abd0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
abe0: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
abf0: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
ac00: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
ac10: 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  n <= (int)pPage-
ac20: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ac30: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
ac40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ac50: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
ac60: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ac70: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ac80: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
ac90: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
aca0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
acb0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
acc0: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
acd0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
ace0: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
acf0: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
ad00: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
ad10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ad20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ad30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
ad50: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
ad60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ad70: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
ad80: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ad90: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
ada0: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
adb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
adc0: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
add0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
ade0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
adf0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
ae00: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
ae10: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
ae20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
ae30: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
ae40: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
ae50: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
ae60: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
ae70: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
ae80: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
ae90: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
aea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
aeb0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
aec0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
aed0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
aee0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
aef0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
af00: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
af10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
af20: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
af30: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
af40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
af50: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
af60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
af70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
af80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
af90: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
afa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
afb0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
afc0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
afd0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
afe0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aff0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
b000: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
b010: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
b020: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
b030: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
b040: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
b050: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
b060: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
b070: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
b080: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
b090: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
b0a0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
b0b0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
b0c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
b0d0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
b0e0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
b0f0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b100: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
b110: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
b130: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
b140: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
b150: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
b160: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
b170: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b180: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
b190: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
b1a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b1b0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
b1c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b1d0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
b1e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b1f0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b200: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b210: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b220: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
b230: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
b240: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
b250: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
b260: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
b270: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b280: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
b290: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
b2a0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
b2b0: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
b2c0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b2d0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
b2e0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
b2f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b300: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
b310: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b320: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b330: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b340: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b350: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
b360: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
b370: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
b380: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b390: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
b3a0: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
b3b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b3c0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b3d0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b3e0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b3f0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
b400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b410: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b420: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
b430: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
b440: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b450: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
b460: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b470: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b480: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b490: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b4a0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
b4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
b4c0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
b4d0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
b4e0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
b4f0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
b500: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
b510: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
b520: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
b530: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
b540: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
b550: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
b560: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
b570: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
b580: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
b590: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
b5a0: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
b5b0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
b5c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
b5d0: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
b5e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
b5f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b600: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
b610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b620: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b630: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b640: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b650: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
b660: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
b670: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b680: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b690: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b6a0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
b6b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b6c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
b6d0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
b6e0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
b6f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
b700: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
b710: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
b720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b730: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
b740: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
b750: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
b760: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
b770: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b780: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
b790: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
b7a0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
b7b0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
b7c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
b7d0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
b7e0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
b7f0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
b800: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
b810: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
b820: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
b830: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
b840: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
b850: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
b860: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
b870: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
b880: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
b890: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
b8a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
b8b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
b8c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
b8d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
b8e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
b8f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
b900: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
b910: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
b920: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b930: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
b940: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
b950: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b960: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
b970: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
b980: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
b990: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
b9a0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
b9b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
b9c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b9d0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
b9e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b9f0: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
ba00: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
ba10: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
ba20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ba30: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
ba40: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
ba50: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
ba60: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
ba70: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
ba80: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
ba90: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
baa0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
bab0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
bac0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
bad0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
bae0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
baf0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
bb00: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
bb10: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
bb20: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
bb30: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
bb40: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
bb50: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
bb60: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
bb70: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
bb80: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
bb90: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
bba0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
bbb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
bbc0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
bbd0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
bbe0: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
bbf0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
bc00: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
bc10: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
bc20: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
bc30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bc50: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
bc60: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
bc70: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
bc80: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
bc90: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
bca0: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
bcb0: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
bcc0: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
bcd0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
bce0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
bcf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
bd00: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
bd10: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
bd20: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
bd30: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
bd40: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
bd50: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
bd60: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
bd80: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
bd90: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
bda0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
bdb0: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
bdc0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
bdd0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
bde0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
bdf0: 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65   - 4;.#if define
be00: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
be10: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
be20: 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ECK).    {.     
be30: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
be40: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
be50: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
be60: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
be70: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
be80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
be90: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
bea0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
beb0: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
bec0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bed0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
bee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
bef0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bf00: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
bf10: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bf20: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
bf30: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
bf40: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
bf50: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
bf60: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf70: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf80: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
bf90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bfa0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
bfc0: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
bfd0: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
bfe0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bff0: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
c000: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
c010: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
c020: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c040: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c060: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
c070: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
c080: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23  ast++;.    }  .#
c090: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
c0a0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c0b0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c0c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
c0d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c0e0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
c0f0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
c100: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
c110: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
c120: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
c130: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
c140: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c150: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c160: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
c170: 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  f free block is 
c180: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
c190: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c1a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c1b0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c1c0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
c1d0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
c1e0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
c1f0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
c200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
c210: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
c220: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
c230: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c240: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
c250: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c260: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c270: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
c280: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
c290: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
c2a0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
c2b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
c2c0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c2e0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c2f0: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
c300: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
c310: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
c320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c330: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
c340: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
c350: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
c360: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
c370: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
c380: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
c390: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
c3a0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
c3b0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
c3c0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c3d0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
c3e0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
c3f0: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
c400: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
c410: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
c420: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
c430: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
c440: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
c450: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
c460: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c470: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
c480: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
c490: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
c4a0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
c4b0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
c4c0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
c4d0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c500: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c510: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
c520: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
c530: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
c540: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
c550: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
c560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c570: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
c580: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
c590: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
c5a0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
c5b0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
c5c0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
c5d0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
c5e0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c5f0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
c600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c610: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c620: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
c630: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
c640: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
c650: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
c660: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
c670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c680: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
c690: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c6a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
c6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c6c0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
c6d0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
c6e0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
c6f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c700: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c710: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c720: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
c730: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c740: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c750: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c760: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c770: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c780: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
c790: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
c7a0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
c7b0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
c7c0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
c7d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c7e0: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
c7f0: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
c800: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
c810: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
c820: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
c830: 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65  0 ?1:0);.  memse
c840: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
c850: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
c860: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
c870: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c880: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
c890: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
c8a0: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
c8b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c8c0: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
c8d0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
c8e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
c8f0: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
c900: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c910: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
c920: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
c930: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
c940: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
c950: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
c960: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
c970: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
c980: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
c990: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
c9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
c9b0: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
c9c0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
c9d0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
c9e0: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
c9f0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
ca00: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
ca10: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
ca20: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
ca30: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
ca40: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
ca50: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
ca60: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
ca70: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
ca80: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
ca90: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
caa0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
cab0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
cac0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
cad0: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
cae0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
caf0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
cb00: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
cb10: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
cb20: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
cb30: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
cb40: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
cb50: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
cb60: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
cb70: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
cb80: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
cb90: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
cba0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
cbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
cbc0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
cbd0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
cbe0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cbf0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc00: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc10: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
cc20: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
cc30: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
cc40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
cc50: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
cc60: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
cc70: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
cc80: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
cc90: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
cca0: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
ccb0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
ccc0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
ccd0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
cce0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
ccf0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
cd00: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
cd10: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
cd20: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
cd30: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
cd40: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
cd50: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
cd60: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
cd70: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
cd80: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
cd90: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
cda0: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
cdb0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
cdc0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
cdd0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
cde0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
cdf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
ce00: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
ce10: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
ce20: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
ce30: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
ce40: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
ce50: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
ce60: 2c 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  ,       /* Do no
ce70: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
ce80: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ent if true */. 
ce90: 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20   int bReadonly  
cea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ceb0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
cec0: 61 70 29 20 70 61 67 65 20 69 73 20 6f 6b 20 2a  ap) page is ok *
ced0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
cee0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
cef0: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
cf00: 28 6e 6f 43 6f 6e 74 65 6e 74 20 3f 20 50 41 47  (noContent ? PAG
cf10: 45 52 5f 41 43 51 55 49 52 45 5f 4e 4f 43 4f 4e  ER_ACQUIRE_NOCON
cf20: 54 45 4e 54 20 3a 20 30 29 20 0a 20 20 20 20 20  TENT : 0) .     
cf30: 20 20 20 20 20 20 20 7c 20 28 62 52 65 61 64 6f         | (bReado
cf40: 6e 6c 79 20 3f 20 50 41 47 45 52 5f 41 43 51 55  nly ? PAGER_ACQU
cf50: 49 52 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  IRE_READONLY : 0
cf60: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 6f  );..  assert( no
cf70: 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 52  Content==0 || bR
cf80: 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadonly==0 );.  
cf90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cfa0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cfb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
cfc0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
cfd0: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
cfe0: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
cff0: 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
d000: 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
d010: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
d020: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
d030: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
d040: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
d050: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d060: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
d070: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
d080: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d090: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
d0a0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
d0b0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
d0c0: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
d0d0: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
d0e0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
d0f0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
d100: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
d110: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
d120: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
d130: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
d140: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
d150: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
d160: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
d170: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d180: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d190: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
d1a0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
d1b0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
d1c0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
d1d0: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
d1e0: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
d1f0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
d200: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
d210: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d220: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
d230: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
d240: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d250: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
d260: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
d270: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
d280: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
d290: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
d2a0: 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
d2b0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
d2c0: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
d2d0: 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
d2e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
d2f0: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
d300: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d310: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
d320: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
d330: 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
d340: 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
d350: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   );.  return (in
d360: 74 29 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  t)btreePagecount
d370: 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
d380: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
d390: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
d3a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
d3b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d3c0: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
d3d0: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
d3e0: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
d3f0: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
d400: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
d410: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
d420: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d430: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
d440: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
d450: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
d460: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
d470: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
d480: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
d490: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
d4a0: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
d4b0: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
d4c0: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
d4d0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d4f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d500: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d530: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
d540: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
d550: 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
d560: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d570: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d580: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62   here */.  int b
d590: 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20  Readonly        
d5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d5b0: 75 65 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c  ue if a read-onl
d5c0: 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 69 73  y (mmap) page is
d5d0: 20 6f 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   ok */.){.  int 
d5e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d5f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d600: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d610: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d620: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d630: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d640: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d660: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d670: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d680: 65 2c 20 30 2c 20 62 52 65 61 64 6f 6e 6c 79 29  e, 0, bReadonly)
d690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
d6a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d6b0: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
d6c0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d6d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d6e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d6f0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
d700: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
d710: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
d720: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
d730: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
d740: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
d750: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
d760: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d770: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
d780: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
d790: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
d7a0: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
d7b0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
d7c0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
d7d0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
d7e0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
d7f0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
d800: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d810: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d830: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
d840: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d850: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
d860: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
d870: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
d880: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d890: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
d8a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
d8b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
d8c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d8d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
d8e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
d8f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
d900: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
d910: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
d920: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
d930: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
d940: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
d950: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
d960: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
d970: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
d980: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
d990: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
d9a0: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
d9b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
d9c0: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
d9d0: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
d9e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d9f0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
da00: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
da10: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
da20: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
da30: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
da40: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
da50: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
da60: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
da70: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
da80: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
da90: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
daa0: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
dab0: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
dac0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
dad0: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
dae0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
daf0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
db00: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
db10: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
db20: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
db30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
db40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
db50: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
db60: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
db70: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
db80: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
db90: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
dba0: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
dbb0: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
dbc0: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
dbd0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
dbe0: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
dbf0: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
dc00: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
dc10: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
dc20: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
dc30: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
dc40: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
dc50: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
dc60: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
dc70: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
dc80: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
dc90: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
dca0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
dcb0: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
dcc0: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
dcd0: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
dce0: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
dcf0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
dd00: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
dd10: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
dd20: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
dd30: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
dd40: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
dd50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
dd60: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
dd70: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
dd80: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
dd90: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
dda0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
ddb0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
ddc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
ddd0: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
dde0: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
ddf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
de00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
de10: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
de20: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
de30: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
de40: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
de50: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
de60: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
de70: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
de80: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
de90: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
dea0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
deb0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
dec0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
ded0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
dee0: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
def0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
df00: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
df10: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
df20: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
df30: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
df40: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
df50: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
df60: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
df70: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
df80: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
df90: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
dfa0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
dfb0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
dfc0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dfd0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
dfe0: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
dff0: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
e000: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
e010: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
e020: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
e030: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
e040: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
e050: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
e060: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
e070: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
e080: 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
e090: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
e0a0: 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
e0b0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
e0c0: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
e0d0: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
e0e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e0f0: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
e100: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
e110: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
e120: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
e130: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
e140: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
e150: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
e160: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
e170: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
e180: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
e190: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
e1a0: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
e1b0: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
e1c0: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
e1d0: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
e1e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e1f0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
e200: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
e210: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
e220: 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
e230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e240: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
e250: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
e260: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
e270: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
e280: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
e290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
e2a0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
e2b0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
e2c0: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
e2d0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e2e0: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
e2f0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
e300: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e320: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
e330: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
e340: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
e350: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
e360: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
e370: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
e380: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
e390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e3a0: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
e3b0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e3c0: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
e3f0: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
e400: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
e410: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
e420: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
e430: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
e440: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
e450: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e460: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
e470: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
e480: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
e490: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4b0: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
e4c0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
e4d0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
e4e0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
e4f0: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
e500: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
e510: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
e520: 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
e530: 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
e540: 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
e550: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
e560: 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
e570: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
e580: 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
e590: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
e5a0: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
e5b0: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
e5c0: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
e5d0: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
e5e0: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
e5f0: 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
e600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e610: 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
e620: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
e630: 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
e640: 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
e650: 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
e660: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
e670: 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
e6a0: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
e6b0: 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
e6e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
e6f0: 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
e700: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
e710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
e720: 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
e730: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e740: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
e750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
e760: 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
e770: 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
e780: 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
e790: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
e7a0: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e7b0: 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
e7c0: 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
e7d0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e7e0: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e7f0: 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
e800: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
e810: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
e820: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e830: 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
e840: 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
e850: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
e860: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e870: 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
e880: 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
e890: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
e8a0: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
e8b0: 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
e8c0: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
e8d0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
e8e0: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
e8f0: 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
e900: 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
e910: 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
e920: 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
e930: 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
e940: 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
e950: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
e960: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
e970: 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
e980: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
e990: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e9a0: 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
e9b0: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
e9c0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
e9d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e9e0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
e9f0: 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
ea00: 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
ea10: 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
ea20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ea30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ea40: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
ea50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ea60: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
ea70: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
ea80: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
ea90: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
eaa0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
eab0: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
eac0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
ead0: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
eae0: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
eaf0: 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
eb00: 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
eb10: 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
eb20: 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
eb30: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
eb40: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
eb50: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
eb60: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
eb70: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
eb80: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
eb90: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
eba0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
ebb0: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
ebc0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
ebd0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
ebe0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
ebf0: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
ec00: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
ec10: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
ec20: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ec30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ec40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ec50: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ec60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ec70: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
ec80: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
ec90: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
eca0: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  name, sqlite3Str
ecb0: 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
ecc0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
ecd0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ece0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ecf0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
ed00: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
ed30: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
ed40: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
ed50: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ed60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ed70: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ed80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ed90: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
eda0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
edb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
edc0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
edd0: 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
ede0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
edf0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ee00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
ee10: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
ee20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ee30: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
ee40: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
ee50: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ee60: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ee70: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
ee80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ee90: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
eea0: 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
eeb0: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
eec0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
eed0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
eee0: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
eef0: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
ef00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
ef10: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
ef20: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
ef30: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
ef40: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
ef50: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
ef60: 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
ef70: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
ef80: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
ef90: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
efa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
efb0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
efc0: 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
efd0: 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
efe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
eff0: 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
f000: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
f010: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
f020: 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
f030: 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
f040: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
f050: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f060: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
f070: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
f080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f090: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f0a0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
f0b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f0c0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f0e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f100: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
f110: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
f120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f130: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
f140: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
f150: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
f160: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f170: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f180: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f190: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f1a0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f1b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
f1c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f1d0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f1e0: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
f1f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
f200: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
f210: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
f220: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
f230: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
f240: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
f250: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
f260: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
f270: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
f280: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
f290: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
f2a0: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
f2b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
f2c0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f2d0: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
f2e0: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
f2f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
f300: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
f310: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
f320: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
f330: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
f340: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f350: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
f360: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
f370: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
f380: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
f390: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
f3a0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
f3b0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
f3c0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
f3d0: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
f3e0: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
f3f0: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
f400: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
f410: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f420: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
f430: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
f440: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f450: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
f460: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
f470: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f480: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
f490: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
f4a0: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
f4b0: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
f4c0: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
f4d0: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
f4e0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
f4f0: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
f500: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
f510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
f520: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
f530: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f540: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
f550: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
f560: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
f570: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
f5a0: 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
f5b0: 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
f5c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f5d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f5e0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
f5f0: 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
f600: 61 67 65 72 2c 20 64 62 2d 3e 6d 78 4d 6d 61 70  ager, db->mxMmap
f610: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f620: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
f630: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
f640: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
f650: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
f660: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f670: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f680: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
f690: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f6a0: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
f6b0: 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
f6c0: 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
f6d0: 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
f6e0: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
f6f0: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
f700: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
f710: 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
f720: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
f730: 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
f740: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
f750: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
f760: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
f770: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
f780: 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
f790: 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
f7a0: 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
f7b0: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
f7c0: 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
f7d0: 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
f7e0: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
f7f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d  .#endif.    pBt-
f800: 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
f810: 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
f820: 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
f830: 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
f840: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
f850: 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
f860: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
f870: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
f880: 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
f890: 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
f8a0: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
f8b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
f8c0: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
f8d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
f8e0: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
f8f0: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
f900: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
f910: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
f920: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
f930: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
f940: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
f950: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
f960: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
f970: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
f980: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
f990: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
f9a0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
f9b0: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
f9c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
f9d0: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
f9e0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
f9f0: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
fa00: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
fa10: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
fa20: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
fa30: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
fa40: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
fa50: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fa60: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
fa70: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
fa80: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
fa90: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
faa0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
fab0: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
fac0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
fad0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
fae0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
faf0: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
fb00: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
fb10: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
fb20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fb30: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
fb40: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
fb50: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
fb60: 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
fb70: 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
fb80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
fb90: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
fba0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
fbb0: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
fbc0: 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
fbd0: 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
fbe0: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
fbf0: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
fc00: 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
fc10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
fc20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fc30: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
fc40: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
fc50: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
fc60: 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
fc70: 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
fc80: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
fc90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
fca0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
fcb0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
fcc0: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
fcd0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
fce0: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
fcf0: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
fd00: 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
fd10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fd20: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
fd30: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
fd40: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
fd50: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
fd60: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
fd70: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
fd80: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
fd90: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
fda0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
fdb0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
fdc0: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
fdd0: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
fde0: 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70  hared; ).      p
fdf0: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
fe00: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
fe10: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
fe20: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
fe30: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
fe40: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
fe50: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
fe60: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
fe70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
fe80: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
fe90: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
fea0: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
feb0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
fec0: 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
fed0: 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
fee0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
fef0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
ff00: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  MEM;.          d
ff10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ff20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
ff30: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
ff40: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
ff50: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ff60: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ff70: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ff80: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
ff90: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
ffa0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
ffb0: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
ffc0: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
ffd0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
ffe0: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
fff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10000 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
10010 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
10020 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
10030 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10040 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
10050 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
10060 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
10070 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
10080 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
10090 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
100a0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
100b0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
100c0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
100d0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
100e0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
100f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
10100 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
10110 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
10120 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
10130 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
10140 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
10150 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10160 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
10170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
10180 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
10190 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
101a0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
101b0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
101c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
101d0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
101e0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
101f0 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
10200 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
10210 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
10220 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
10230 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
10240 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
10250 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
10260 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
10270 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10280 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
10290 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
102a0 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
102b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
102c0 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
102d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
102e0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
102f0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
10300 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
10310 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
10320 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
10330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10340 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
10350 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
10360 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
10370 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
10380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
10390 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
103a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
103b0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
103c0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
103d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
103e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
103f0 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
10400 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10410 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10420 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
10430 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10440 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
10450 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
10460 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
10470 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
10480 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
10490 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
104a0 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
104b0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
104c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
104d0 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
104e0 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
104f0 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
10500 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
10510 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
10520 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
10530 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
10540 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
10550 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
10560 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
10570 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
10580 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
10590 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
105a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
105b0 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
105c0 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
105d0 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
105e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
105f0 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
10600 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
10610 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
10620 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
10630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10640 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
10650 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
10660 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
10670 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
10680 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
10690 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
106a0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
106b0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
106c0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
106d0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
106e0 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
106f0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
10700 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
10710 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
10720 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
10730 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
10740 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
10750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10760 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10770 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
10780 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
10790 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
107a0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
107b0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
107c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
107d0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
107e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
107f0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
10800 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
10810 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10820 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
10830 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
10840 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10850 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
10860 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
10870 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
10880 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
10890 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
108a0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
108b0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
108c0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
108d0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
108e0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
108f0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
10900 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
10910 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10920 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10930 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
10940 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
10950 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
10960 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
10970 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
10980 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
10990 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
109a0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
109b0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
109c0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
109d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
109e0 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
109f0 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
10a00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
10a10 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
10a20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
10a30 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
10a40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10a50 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
10a60 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
10a70 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
10a80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
10a90 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
10aa0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
10ab0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
10ac0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
10ad0 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a  ZE(pBt) bytes..*
10ae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
10af0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
10b00 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10b10 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
10b20 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
10b30 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
10b40 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
10b50 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
10b60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
10b70 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
10b80 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
10b90 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
10ba0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
10bb0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10bc0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
10bd0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
10be0 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
10bf0 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
10c00 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
10c10 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
10c20 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
10c30 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
10c40 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
10c50 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
10c60 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
10c70 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
10c80 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
10c90 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
10ca0 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
10cb0 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
10cc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10cd0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
10ce0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
10cf0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10d00 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
10d10 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
10d20 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
10d30 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
10d40 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
10d50 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
10d60 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
10d70 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
10d80 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
10d90 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
10da0 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
10db0 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
10dc0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
10dd0 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
10de0 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
10df0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
10e00 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
10e10 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
10e20 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
10e30 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
10e40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
10e50 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
10e60 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
10e70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10e80 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
10e90 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
10ea0 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
10eb0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
10ec0 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
10ed0 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
10ee0 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
10ef0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
10f00 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
10f10 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
10f20 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
10f30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
10f40 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
10f50 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
10f60 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
10f70 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
10f80 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
10f90 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
10fa0 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
10fb0 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
10fc0 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
10fd0 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
10fe0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10ff0 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
11000 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
11010 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
11020 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
11030 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
11040 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
11050 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
11060 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
11070 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
11080 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
11090 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
110a0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
110b0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
110c0 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
110d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
110e0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
110f0 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
11100 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
11110 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
11120 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
11130 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11140 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
11150 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
11160 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
11170 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
11180 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
11190 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
111a0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
111b0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
111c0 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
111d0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
111e0 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
111f0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
11200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11210 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
11220 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
11230 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
11240 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
11250 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
11260 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
11270 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
11280 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
11290 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
112a0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
112b0 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
112c0 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
112d0 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
112e0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
112f0 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
11300 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
11310 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
11320 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
11330 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
11340 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
11350 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
11360 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
11370 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
11380 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
11390 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
113a0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
113b0 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
113c0 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
113d0 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
113e0 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
113f0 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
11400 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
11410 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
11420 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
11430 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
11440 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
11450 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
11460 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
11470 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
11480 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
11490 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
114a0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
114b0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
114c0 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
114d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
114e0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
114f0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
11500 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
11510 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11520 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11530 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
11540 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11550 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11560 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11570 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
11580 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
11590 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
115a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
115b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
115c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
115d0 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
115e0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
115f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
11600 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
11610 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
11620 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
11630 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
11640 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
11650 74 36 34 20 6d 78 4d 6d 61 70 29 7b 0a 20 20 42  t64 mxMmap){.  B
11660 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11670 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
11680 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11690 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
116a0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
116b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
116c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
116d0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
116e0 67 65 72 2c 20 6d 78 4d 6d 61 70 29 3b 0a 20 20  ger, mxMmap);.  
116f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11700 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11710 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11720 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
11730 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
11740 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
11750 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
11760 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
11770 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
11780 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
11790 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
117a0 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
117b0 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
117c0 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
117d0 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
117e0 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
117f0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
11800 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
11810 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
11820 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
11830 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
11840 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
11850 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
11860 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11870 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
11880 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
11890 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
118a0 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
118b0 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
118c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
118d0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
118e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
118f0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
11900 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11910 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42  SafetyLevel(.  B
11920 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
11930 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
11940 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
11950 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
11960 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20  .  int level,   
11970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
11980 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
11990 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
119a0 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69  L, 3=FULL */.  i
119b0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20  nt fullSync,    
119c0 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
119d0 66 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20  fullfsync. */.  
119e0 69 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63  int ckptFullSync
119f0 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
11a00 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
11a10 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  fync */.){.  BtS
11a20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11a30 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
11a40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11a50 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  );.  assert( lev
11a70 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
11a80 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  3 );.  sqlite3Bt
11a90 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11aa0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
11ab0 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
11ac0 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
11ad0 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c  llSync, ckptFull
11ae0 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
11af0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11b10 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
11b20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11b30 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
11b40 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
11b50 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
11b60 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
11b70 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
11b80 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
11b90 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
11ba0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11bb0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
11bc0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
11bd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11be0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11c00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11c10 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
11c20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
11c30 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
11c40 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
11c50 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
11c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
11c70 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
11c80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11c90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11ca0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11cb0 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
11cc0 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
11cd0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
11ce0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
11cf0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
11d00 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
11d10 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11d20 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
11d30 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
11d40 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
11d50 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
11d60 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
11d70 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
11d80 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
11d90 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
11da0 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
11db0 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
11dc0 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
11dd0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
11de0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
11df0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
11e00 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
11e10 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
11e20 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
11e30 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
11e40 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
11e50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11e60 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
11e70 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
11e80 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
11e90 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
11ea0 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
11eb0 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
11ec0 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
11ed0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
11ee0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
11ef0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
11f00 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
11f10 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
11f20 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
11f30 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
11f40 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
11f50 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
11f60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
11f70 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
11f80 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
11f90 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
11fa0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
11fb0 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
11fc0 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
11fd0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
11fe0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
11ff0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
12000 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
12010 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
12020 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
12030 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
12040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
12050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
12060 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
12070 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
12080 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
12090 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
120a0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
120b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
120c0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
120d0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
120e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
120f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12100 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
12110 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
12120 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
12130 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
12140 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
12150 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
12160 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
12170 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
12180 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
12190 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
121a0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
121b0 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
121c0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
121d0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
121e0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
121f0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
12200 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
12210 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
12220 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
12230 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
12240 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
12250 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
12260 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
12270 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12280 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
12290 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
122a0 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
122b0 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
122c0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
122d0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
122e0 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
122f0 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
12300 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
12310 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
12320 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12330 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12340 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12350 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
12360 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
12370 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12380 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
12390 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
123a0 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
123b0 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  e;.}..#if define
123c0 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
123d0 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  EC) || defined(S
123e0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
123f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12400 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
12410 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
12420 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
12430 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
12440 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
12450 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
12460 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
12470 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
12480 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
12490 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
124a0 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
124b0 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
124c0 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
124d0 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
124e0 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
124f0 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
12500 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
12510 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
12520 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12530 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
12540 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
12550 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
12560 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
12570 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
12580 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
12590 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
125a0 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
125b0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
125c0 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
125d0 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
125e0 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
125f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12600 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
12610 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
12620 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12630 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
12640 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
12650 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
12660 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
12670 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23  >usableSize;.}.#
12680 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12690 48 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c  HAS_CODEC || SQL
126a0 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
126b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
126c0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
126d0 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
126e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
126f0 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  CUUM)./*.** Retu
12700 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
12710 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
12720 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
12730 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
12740 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
12750 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
12760 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
12770 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
12780 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
12790 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
127a0 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
127b0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
127c0 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
127d0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
127e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
127f0 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
12800 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
12810 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
12820 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12830 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
12840 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
12850 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
12860 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
12870 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
12880 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
12890 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
128a0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
128b0 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
128c0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
128d0 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
128e0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
128f0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
12900 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12910 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
12920 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
12930 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
12940 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12950 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
12960 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
12970 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
12980 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
12990 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
129a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
129b0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
129c0 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  et the BTS_SECUR
129d0 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66  E_DELETE flag if
129e0 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
129f0 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
12a00 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
12a10 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
12a20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
12a30 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
12a40 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
12a50 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74  E.** setting aft
12a60 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a  er the change..*
12a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12a80 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
12a90 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
12aa0 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
12ab0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
12ac0 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
12ad0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12ae0 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
12af0 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
12b00 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
12b10 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
12b20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
12b30 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
12b40 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
12b50 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62  DELETE;.  } .  b
12b60 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
12b70 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
12b80 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20  E_DELETE)!=0;.  
12b90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12ba0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
12bb0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
12bc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12bd0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
12be0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
12bf0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
12c00 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
12c10 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
12c20 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
12c30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
12c40 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
12c50 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
12c60 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12c70 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
12c80 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
12c90 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
12ca0 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
12cb0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
12cc0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
12cd0 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
12ce0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
12cf0 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
12d00 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
12d10 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
12d20 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
12d30 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
12d40 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
12d50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12d60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
12d80 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
12d90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12da0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
12db0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12dc0 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
12dd0 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
12de0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12df0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
12e00 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
12e10 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26  SIZE_FIXED)!=0 &
12e20 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
12e30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
12e40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12e50 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
12e60 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
12e70 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
12e80 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
12e90 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
12ea0 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
12eb0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12ec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
12ed0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
12ee0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
12ef0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
12f00 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
12f10 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
12f20 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
12f30 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
12f40 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
12f50 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
12f60 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
12f70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12f80 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12f90 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
12fa0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
12fb0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
12fc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12fd0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
12fe0 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
12ff0 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
13000 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
13010 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
13020 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
13030 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
13040 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
13050 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
13060 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13070 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13080 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
13090 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
130a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
130b0 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
130c0 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
130d0 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
130e0 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
130f0 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
13100 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
13110 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
13120 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
13130 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
13140 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
13150 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
13160 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
13170 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
13180 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
13190 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
131a0 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
131b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
131c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
131d0 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
131e0 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
131f0 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
13200 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
13210 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13220 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
13230 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
13240 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50  ctions */.  MemP
13250 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20  age *pPage1;    
13260 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68   /* Page 1 of th
13270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13280 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
13290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
132a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
132b0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
132c0 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20    int nPageFile 
132d0 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
132e0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
132f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
13300 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61  /.  int nPageHea
13310 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  der;     /* Numb
13320 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
13330 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f  he database acco
13340 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a  rding to hdr */.
13350 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13360 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
13370 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
13380 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
13390 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
133a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
133b0 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
133c0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
133d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
133e0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
133f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
13400 2c 20 26 70 50 61 67 65 31 2c 20 30 2c 20 30 29  , &pPage1, 0, 0)
13410 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13420 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
13430 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
13440 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
13450 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
13460 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
13470 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
13480 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
13490 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
134a0 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
134b0 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
134c0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
134d0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
134e0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
134f0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
13500 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
13510 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
13520 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
13530 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
13540 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
13550 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
13560 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
13570 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
13580 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
13590 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
135a0 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
135b0 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
135c0 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
135d0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
135e0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
135f0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
13600 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
13610 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13620 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
13630 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
13640 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
13650 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
13660 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
13670 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
13680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13690 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
136a0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
136b0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
136c0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
136d0 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
136e0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
136f0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
13700 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
13710 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
13720 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13730 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13740 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
13750 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
13760 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
13770 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
13780 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
13790 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
137a0 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
137b0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
137c0 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
137d0 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
137e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
137f0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
13800 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
13810 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
13820 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
13830 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
13840 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
13850 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
13860 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
13870 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
13880 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
13890 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
138a0 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
138b0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
138c0 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
138d0 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
138e0 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
138f0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
13900 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
13910 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
13920 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
13930 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
13940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
13950 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
13960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13970 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
13980 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
13990 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
139a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
139b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
139c0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
139d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
139e0 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
139f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
13a00 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
13a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
13a40 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
13a50 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
13a60 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
13a70 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
13a80 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
13a90 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
13aa0 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
13ab0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
13ac0 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
13ad0 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
13ae0 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
13af0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
13b00 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
13b10 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
13b20 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
13b30 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
13b40 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
13b50 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
13b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13b70 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
13b80 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
13b90 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
13ba0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13bb0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13bc0 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
13bd0 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
13be0 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
13bf0 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
13c00 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
13c10 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
13c20 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
13c30 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
13c40 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
13c50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
13c60 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13c70 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
13c80 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
13c90 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
13ca0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
13cb0 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
13cc0 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
13cd0 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
13ce0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
13cf0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
13d00 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
13d10 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13d20 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
13d30 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
13d40 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
13d50 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
13d60 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
13d70 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
13d80 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
13d90 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
13da0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
13db0 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
13dc0 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
13dd0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
13de0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
13df0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
13e00 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
13e10 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
13e20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
13e30 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
13e40 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
13e50 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
13e60 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13e70 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
13e80 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
13e90 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
13ea0 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
13eb0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
13ec0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13ed0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
13ee0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
13ef0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
13f20 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
13f30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
13f40 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
13f50 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
13f60 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
13f70 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
13f80 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
13f90 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13fa0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
13fb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
13fc0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
13fd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61     }.    if( usa
13fe0 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
13ff0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
14000 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
14010 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
14020 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
14030 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
14040 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
14050 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
14060 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14070 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
14080 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
14090 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
140a0 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
140b0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
140c0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
140d0 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
140e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
140f0 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
14100 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
14110 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
14120 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
14130 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
14140 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
14150 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
14160 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
14170 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
14180 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
14190 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
141a0 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
141b0 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
141c0 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
141d0 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
141e0 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
141f0 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
14200 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
14210 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
14220 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
14230 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
14240 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
14250 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
14260 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
14270 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
14280 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
14290 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
142a0 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
142b0 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
142c0 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
142d0 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
142e0 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
142f0 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
14300 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
14310 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
14320 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
14330 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
14340 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
14350 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
14360 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
14370 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
14380 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
14390 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
143a0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
143b0 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
143c0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
143d0 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
143e0 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
143f0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
14400 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
14410 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
14420 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
14430 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
14440 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
14450 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
14460 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
14470 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
14480 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
14490 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
144a0 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
144b0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
144c0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
144d0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
144e0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
144f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14500 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
14510 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
14520 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
14530 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
14540 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
14550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
14560 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
14570 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
14580 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
14590 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
145a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
145b0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
145c0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
145d0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
145e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
145f0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
14600 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
14610 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
14620 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
14630 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
14640 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
14650 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
14660 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
14670 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
14680 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14690 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
146a0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
146b0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
146c0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
146d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
146e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
146f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
14700 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20  ->pCursor==0 || 
14710 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14720 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
14730 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
14740 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
14750 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
14760 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61  age1!=0 ){.    a
14770 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
14780 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
14790 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
147a0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
147b0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
147c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
147d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
147e0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
147f0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
14800 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
14810 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
14820 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
14830 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
14840 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
14850 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
14860 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
14870 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
14880 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
14890 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
148a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
148b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
148c0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
148d0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
148e0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
148f0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
14900 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
14910 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14920 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
14930 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
14940 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
14950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14960 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
14970 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
14980 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
14990 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
149a0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
149b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
149c0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
149d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
149e0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
149f0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
14a00 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
14a10 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
14a20 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
14a30 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
14a40 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
14a50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
14a60 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
14a70 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
14a80 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
14a90 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
14aa0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
14ab0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
14ac0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
14ad0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
14ae0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
14af0 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
14b00 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
14b10 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
14b20 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
14b30 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
14b40 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
14b50 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
14b60 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
14b70 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
14b80 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
14b90 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
14ba0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
14bb0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
14bc0 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
14bd0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
14be0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
14bf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14c00 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
14c10 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
14c20 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
14c30 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
14c40 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
14c50 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
14c60 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
14c70 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
14c80 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
14c90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
14ca0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
14cb0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
14cc0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
14cd0 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
14ce0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
14cf0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
14d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14d10 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
14d20 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
14d30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14d40 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
14d50 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
14d60 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
14d70 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
14d80 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
14d90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
14da0 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
14db0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
14dc0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
14dd0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
14de0 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
14df0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
14e00 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
14e10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
14e20 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
14e30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
14e40 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
14e50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14e60 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14e70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
14e80 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
14e90 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
14ea0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
14eb0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
14ec0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
14ed0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
14ee0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
14ef0 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
14f00 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
14f10 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
14f20 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
14f30 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
14f40 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
14f50 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
14f60 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
14f70 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
14f80 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
14f90 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
14fa0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
14fb0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
14fc0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
14fd0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
14fe0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
14ff0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
15000 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
15010 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
15020 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
15030 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
15040 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
15050 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
15060 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
15070 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
15080 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
15090 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
150a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
150b0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
150c0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
150d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
150e0 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
150f0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
15100 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
15110 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15120 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
15130 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15140 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
15150 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15160 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
15170 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15180 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
15190 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
151a0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
151b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
151c0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
151d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
151e0 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
151f0 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
15200 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
15210 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
15220 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
15230 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
15240 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
15250 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
15260 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
15270 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
15280 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
15290 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
152a0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
152b0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
152c0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
152d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
152e0 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
152f0 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
15300 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
15310 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
15320 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
15330 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
15340 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
15350 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
15360 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
15370 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
15380 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
15390 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
153a0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
153b0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
153c0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
153d0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
153e0 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
153f0 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
15400 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
15410 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
15420 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
15430 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
15440 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
15450 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
15460 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
15470 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
15480 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
15490 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
154a0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
154b0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
154c0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
154d0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
154e0 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
154f0 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
15500 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
15510 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
15520 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
15530 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
15540 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
15550 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
15560 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15570 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15580 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
15590 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
155a0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
155b0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
155c0 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
155d0 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
155e0 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
155f0 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
15600 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
15610 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
15620 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
15630 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
15640 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
15650 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15660 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
15670 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
15680 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
15690 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
156a0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
156b0 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gun;.  }.  asser
156c0 74 28 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  t( IfNotOmitAV(p
156d0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
156e0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
156f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
15700 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
15710 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
15720 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
15730 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
15740 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
15750 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
15760 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15770 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
15780 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
15790 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
157a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
157b0 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
157c0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
157d0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
157e0 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
157f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
15800 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
15810 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
15820 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
15830 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
15840 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
15850 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
15860 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
15870 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
15880 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
15890 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
158a0 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  E).   || (pBt->b
158b0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
158c0 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20  NDING)!=0.  ){. 
158d0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
158e0 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
158f0 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
15900 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
15910 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
15920 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
15930 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
15940 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
15950 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
15960 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
15970 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
15980 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
15990 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
159a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
159b0 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29  }.  if( pBlock )
159c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
159d0 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
159e0 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
159f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
15a00 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
15a10 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  E;.    goto tran
15a20 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e  s_begun;.  }.#en
15a30 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
15a40 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
15a50 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
15a60 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
15a70 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
15a80 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
15a90 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
15aa0 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
15ab0 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
15ac0 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
15ad0 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
15ae0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
15af0 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
15b00 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
15b10 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
15b20 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
15b30 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
15b40 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
15b50 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
15b60 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
15b70 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c   &= ~BTS_INITIAL
15b80 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20  LY_EMPTY;.  if( 
15b90 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20  pBt->nPage==0 ) 
15ba0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15bb0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
15bc0 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  MPTY;.  do {.   
15bd0 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
15be0 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
15bf0 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
15c00 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
15c10 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
15c20 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
15c30 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
15c40 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
15c50 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
15c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15c70 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
15c80 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
15c90 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
15ca0 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
15cb0 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
15cc0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
15cd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
15ce0 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
15cf0 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
15d00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
15d10 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
15d20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
15d30 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
15d40 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
15d50 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
15d60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
15d70 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
15d80 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
15d90 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
15da0 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
15db0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15dc0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
15dd0 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74      if( (pBt->bt
15de0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
15df0 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  D_ONLY)!=0 ){.  
15e00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15e10 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
15e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15e40 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
15e50 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c  ger,wrflag>1,sql
15e60 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
15e70 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
15e80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15ea0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
15eb0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
15ec0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
15ed0 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
15ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15ef0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
15f00 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
15f10 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
15f20 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
15f30 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
15f40 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
15f50 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
15f60 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
15f70 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
15f80 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15fa0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
15fb0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
15fc0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15fd0 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
15fe0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15ff0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
16000 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
16010 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16020 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
16030 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
16040 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
16050 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
16060 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
16070 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
16080 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
16090 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
160a0 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
160b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
160c0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
160d0 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
160e0 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
160f0 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
16100 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
16110 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
16120 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
16130 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
16140 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
16150 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
16160 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
16170 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
16180 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
16190 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
161a0 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
161b0 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
161c0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
161d0 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
161e0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
161f0 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
16200 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
16210 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
16220 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
16230 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
16240 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16250 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
16260 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
16270 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
16280 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
16290 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
162a0 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
162b0 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
162c0 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
162d0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
162e0 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
162f0 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
16300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
16310 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
16320 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
16330 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
16340 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
16350 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
16360 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
16370 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
16380 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
16390 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
163a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
163b0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
163c0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
163d0 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
163e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
163f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
16400 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
16410 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16430 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
16440 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
16450 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
16460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16470 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e      }.  }...tran
16480 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72  s_begun:.  if( r
16490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
164a0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a  wrflag ){.    /*
164b0 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
164c0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
164d0 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
164e0 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
164f0 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
16500 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
16510 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
16520 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
16530 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20   and.    ** the 
16540 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
16550 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
16560 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
16570 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
16580 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
16590 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
165a0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
165b0 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
165c0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  epoint);.  }..  
165d0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
165e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
165f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16600 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
16610 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16620 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
16630 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
16640 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
16650 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
16660 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
16670 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
16680 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
16690 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
166a0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
166b0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
166c0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
166d0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
166e0 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
166f0 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
16700 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
16710 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
16720 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16740 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
16750 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
16760 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
16770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16780 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
16790 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
167a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
167d0 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
167e0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
167f0 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f  Bt;.  u8 isInitO
16800 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
16810 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
16820 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
16830 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16840 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
16850 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
16860 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
16870 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
16880 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
168a0 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
168b0 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
168c0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
168d0 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
168e0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
168f0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
16900 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
16910 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
16920 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
16930 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
16940 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
16950 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
16960 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
16970 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
16980 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
16990 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
169a0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
169b0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
169c0 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
169d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
169e0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
169f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
16a00 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
16a10 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
16a20 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
16a30 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
16a40 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
16a50 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
16a60 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
16a70 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
16a80 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
16a90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16aa0 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
16ab0 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
16ac0 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
16ad0 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
16ae0 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
16af0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
16b00 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
16b10 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
16b20 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
16b30 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
16b40 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
16b50 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
16b60 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
16b70 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
16b80 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
16b90 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
16ba0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16bb0 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
16bc0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
16bd0 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
16be0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
16bf0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
16c00 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
16c10 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
16c20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
16c30 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
16c40 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
16c50 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
16c60 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
16c70 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
16c80 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
16c90 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
16ca0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
16cc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
16cd0 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
16ce0 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
16cf0 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
16d00 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
16d10 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
16d20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
16d30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16d40 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
16d50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
16d60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
16d70 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
16d80 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
16d90 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
16da0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
16db0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
16dc0 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
16dd0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16de0 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
16df0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
16e00 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
16e10 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
16e20 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
16e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
16e40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
16e50 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
16e60 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
16e70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16e80 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
16e90 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
16ea0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
16eb0 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74  t nCell;..    bt
16ec0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
16ed0 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  e);.    nCell = 
16ee0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
16ef0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
16f00 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
16f10 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
16f20 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
16f30 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
16f40 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
16f50 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
16f60 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
16f70 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
16f80 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
16f90 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
16fa0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
16fb0 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
16fc0 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69   && pCell+info.i
16fd0 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67  Overflow+3<=pPag
16fe0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
16ff0 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
17000 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
17010 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
17020 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20  .iOverflow]).   
17030 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17040 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
17050 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
17060 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
17070 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17080 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
17090 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
170a0 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
170b0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
170c0 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
170d0 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
170e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
170f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
17100 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
17110 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
17120 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
17130 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
17140 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
17150 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
17160 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
17170 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
17180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17190 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
171a0 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
171b0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
171c0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
171d0 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
171e0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
171f0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
17200 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
17210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
17220 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
17230 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
17240 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
17250 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
17260 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
17270 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
17280 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
17290 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
172a0 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
172b0 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
172c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
172d0 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
172e0 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
172f0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
17300 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
17310 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
17320 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
17330 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
17340 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
17350 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
17360 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
17370 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
17380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
17390 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
173a0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
173b0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
173c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
173d0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
173e0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
173f0 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
17420 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
17430 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
17440 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
17450 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17460 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
17470 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
17480 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
17490 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
174a0 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
174b0 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
174c0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
174d0 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
174e0 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
174f0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
17500 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
17510 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
17520 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
17530 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
17540 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
17550 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
17560 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
17570 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
17580 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
17590 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
175a0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
175b0 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
175c0 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
175d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
175e0 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
175f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
17600 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
17610 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
17620 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17630 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17640 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
17650 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
17660 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
17670 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
17680 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
17690 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
176a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
176b0 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
176c0 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
176d0 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
176e0 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
176f0 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
17700 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
17710 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
17720 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
17730 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17740 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
17750 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
17760 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
17770 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
17780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17790 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
177a0 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
177b0 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
177c0 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
177d0 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
177e0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
177f0 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
17800 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
17810 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
17820 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
17830 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
17840 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
17850 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
17860 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
17870 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
17880 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
17890 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
178a0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
178b0 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
178c0 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
178d0 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
178e0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
178f0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
17900 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
17910 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
17920 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
17930 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
17940 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
17950 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
17960 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
17970 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
17980 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
17990 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
179a0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
179b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
179c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
179d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
179e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
179f0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
17a00 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
17a10 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
17a20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
17a30 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
17a40 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
17a50 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
17a60 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
17a70 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
17a80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17a90 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
17aa0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
17ab0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
17ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
17ad0 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
17ae0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
17af0 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
17b00 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
17b10 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
17b20 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
17b30 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
17b40 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
17b50 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
17b60 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
17b70 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
17b80 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
17b90 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
17ba0 26 70 50 74 72 50 61 67 65 2c 20 30 2c 20 30 29  &pPtrPage, 0, 0)
17bb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17bc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17be0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
17bf0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
17c00 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
17c10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17c30 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
17c40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
17c50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17c60 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
17c70 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
17c80 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
17c90 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
17ca0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17cb0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
17cc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17cd0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
17ce0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
17cf0 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
17d00 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  ge, &rc);.    }.
17d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17d20 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
17d30 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
17d40 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
17d50 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
17d60 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
17d70 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
17d80 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
17d90 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
17da0 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
17db0 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
17dc0 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
17dd0 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
17de0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
17df0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  .** SQLITE_OK. I
17e00 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
17e10 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
17e20 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74  erefore no point
17e30 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   in .** calling 
17e40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
17e50 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
17e60 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66  ITE_DONE. Or, if
17e70 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
17e80 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d  curs, return som
17e90 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
17ea0 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  de..**.** More s
17eb0 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
17ec0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
17ed0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
17ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
17ef0 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
17f00 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
17f10 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
17f20 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
17f30 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
17f40 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
17f50 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17f60 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
17f70 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
17f80 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
17f90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
17fa0 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
17fb0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
17fc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
17fd0 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
17fe0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
17ff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
18000 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
18010 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
18020 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
18030 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
18040 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
18050 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
18060 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
18070 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
18080 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
18090 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74 20 0a 2a  um-on-commmit .*
180a0 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
180b0 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
180c0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
180d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
180e0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
180f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
18100 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
18110 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
18120 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
18130 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
18140 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
18150 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
18160 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
18170 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
18180 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18190 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
181a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
181b0 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
181c0 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
181d0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
181e0 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
181f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18200 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
18210 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
18220 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
18230 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
18240 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18250 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
18260 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
18270 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
18280 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
18290 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
182a0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
182b0 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
182c0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
182d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
182e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
182f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
18300 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
18310 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
18320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18330 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18340 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
18350 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
18360 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
18370 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
18380 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
18390 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
183a0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
183b0 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
183c0 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
183d0 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
183e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
183f0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
18400 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
18410 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
18420 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
18430 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
18440 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
18450 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
18460 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
18470 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
18480 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
18490 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
184a0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
184b0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
184c0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
184d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
184e0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
184f0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
18500 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
18510 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
18520 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18540 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18550 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
18560 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
18570 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
18580 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
18590 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
185a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
185b0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
185c0 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
185d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
185e0 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
185f0 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
18600 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
18610 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
18620 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
18630 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
18640 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
18650 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
18660 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
18670 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
18680 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
18690 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
186a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
186b0 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
186c0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
186d0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
186e0 61 73 74 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  astPg, 0, 0);.  
186f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18720 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
18730 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
18740 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
18750 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
18760 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
18770 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
18780 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
18790 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
187a0 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
187b0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
187c0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
187d0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
187e0 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
187f0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
18800 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
18810 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
18820 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
18830 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
18840 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
18850 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
18860 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
18870 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
18880 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
18890 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
188a0 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
188b0 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
188c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
188d0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
188e0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
188f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
18900 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
18910 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
18920 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
18930 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18950 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
18960 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
18970 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18980 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
18990 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
189a0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
189b0 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
189c0 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
189d0 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
189e0 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
189f0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
18a00 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
18a10 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
18a20 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
18a30 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
18a40 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
18a50 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
18a60 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
18a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18a80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18aa0 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
18ab0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
18ac0 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
18ad0 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
18ae0 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
18af0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
18b00 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
18b10 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
18b20 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
18b30 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
18b40 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
18b50 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
18b60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18b70 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
18b80 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
18b90 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
18ba0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
18bb0 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
18bc0 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
18bd0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
18be0 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
18bf0 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
18c00 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
18c10 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
18c20 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
18c30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
18c40 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
18c50 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
18c60 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
18c70 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
18c80 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
18c90 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18cb0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
18cc0 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
18cd0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
18ce0 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
18cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18d00 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
18d10 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
18d20 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
18d50 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
18d60 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
18d70 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
18d80 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
18d90 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
18da0 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
18db0 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
18dc0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
18dd0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
18de0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
18df0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
18e00 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
18e10 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
18e20 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
18e30 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
18e40 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
18e50 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
18e60 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18e70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
18e80 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
18e90 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
18ea0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
18eb0 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
18ec0 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
18ed0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
18ee0 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
18ef0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
18f00 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
18f10 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
18f20 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
18f30 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
18f40 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
18f50 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
18f60 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
18f70 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
18f80 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
18f90 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
18fa0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
18fb0 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
18fc0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18fd0 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
18fe0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
18ff0 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
19000 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
19010 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19020 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
19030 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19040 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19050 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
19060 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
19070 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
19080 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
19090 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
190a0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
190b0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
190c0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
190d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
190e0 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
190f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
19100 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
19110 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
19120 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
19130 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
19140 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
19150 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
19160 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
19170 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
19180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
19190 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
191a0 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
191b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
191c0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
191d0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
191e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
191f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
19200 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
19210 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
19220 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
19230 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
19240 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
19250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19270 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19280 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19290 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
192a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
192b0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
192c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
192d0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
192e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
192f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
19300 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
19310 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
19320 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
19330 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19340 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19350 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
19360 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
19370 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
19380 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
19390 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
193a0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
193b0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
193c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
193d0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
193e0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
193f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
19400 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19410 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
19420 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
19430 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
19440 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
19450 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
19460 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
19470 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
19480 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
19490 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
194a0 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
194b0 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
194c0 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
194d0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
194e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
194f0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19500 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
19510 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
19520 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
19530 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
19540 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
19550 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19560 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19570 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
19580 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
19590 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
195a0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
195b0 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
195c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
195d0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
195e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
195f0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
19600 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
19610 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
19620 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
19630 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
19640 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
19650 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
19660 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
19670 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
19680 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
19690 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
196a0 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
196b0 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
196c0 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
196d0 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
196e0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
196f0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
19700 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
19710 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
19720 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19730 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
19740 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
19750 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
19760 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
19770 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
19780 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
19790 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
197a0 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
197b0 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
197c0 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
197d0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
197e0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
197f0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
19800 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
19810 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19820 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
19830 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
19840 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
19850 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
19860 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
19870 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
19880 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
19890 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
198a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
198b0 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
198c0 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
198d0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
198e0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
198f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
19900 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
19910 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
19920 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
19930 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
19940 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
19950 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
19960 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
19970 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
19980 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
19990 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
199a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
199b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
199c0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
199d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
199e0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
199f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
19a00 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
19a10 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
19a20 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
19a30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
19a40 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
19a50 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
19a60 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
19a70 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
19a80 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
19a90 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
19aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19ab0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19ac0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
19ad0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
19ae0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
19af0 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
19b00 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
19b10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19b20 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
19b30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19b40 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
19b50 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
19b60 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
19b70 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
19b80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
19b90 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
19ba0 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
19bb0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
19bc0 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
19bd0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
19be0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
19bf0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
19c00 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
19c10 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
19c20 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
19c30 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
19c40 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
19c50 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
19c60 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
19c70 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
19c80 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
19c90 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
19ca0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
19cb0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
19cc0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
19cd0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
19ce0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
19cf0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
19d00 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
19d10 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
19d20 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
19d30 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
19d40 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
19d50 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
19d60 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
19d70 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
19d80 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
19d90 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
19da0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
19db0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
19dc0 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
19dd0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
19de0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
19df0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
19e00 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
19e10 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
19e20 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
19e30 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
19e40 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
19e50 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
19e60 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
19e70 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
19e80 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
19e90 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
19ea0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
19eb0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
19ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19ed0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
19ee0 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
19ef0 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
19f00 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
19f10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
19f20 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
19f30 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
19f40 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
19f50 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
19f60 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
19f70 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
19f80 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
19f90 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
19fa0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
19fb0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
19fc0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
19fd0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
19fe0 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
19ff0 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
1a000 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
1a010 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
1a020 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
1a030 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
1a040 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
1a050 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
1a060 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
1a070 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
1a080 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
1a090 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
1a0a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a0b0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1a0c0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
1a0d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a0e0 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
1a0f0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1a100 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
1a110 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a120 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a130 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a140 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1a150 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a160 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a170 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
1a180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1a190 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1a1a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1a1b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
1a1c0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
1a1d0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1a1e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a1f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1a200 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1a210 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a230 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
1a240 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1a250 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1a260 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
1a270 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
1a280 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1a290 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a2a0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1a2b0 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
1a2c0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
1a2d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1a2e0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1a2f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a300 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a310 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1a320 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
1a330 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
1a340 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
1a350 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
1a360 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
1a370 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1a380 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
1a390 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
1a3a0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
1a3b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a3c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1a3d0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1a3e0 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1a3f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1a400 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
1a410 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
1a420 64 69 66 0a 20 20 62 74 72 65 65 43 6c 65 61 72  dif.  btreeClear
1a430 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1a440 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a450 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
1a460 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62  p->db->activeVdb
1a470 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  eCnt>1 ){.    /*
1a480 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1a490 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1a4a0 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1a4b0 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1a4c0 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1a4d0 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1a4e0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1a4f0 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1a500 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1a510 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1a520 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1a530 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1a540 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1a550 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1a560 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1a570 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1a580 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1a590 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1a5a0 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1a5b0 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1a5c0 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1a5d0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1a5e0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1a5f0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1a600 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1a610 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1a620 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1a630 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1a640 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1a650 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1a660 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1a670 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1a680 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1a690 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1a6a0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1a6b0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1a6c0 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1a6d0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1a6e0 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1a6f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1a700 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1a710 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1a720 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1a730 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1a740 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1a750 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1a760 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1a770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1a780 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1a790 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1a7a0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1a7b0 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1a7c0 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1a7d0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1a7e0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1a7f0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1a800 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1a810 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1a820 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1a830 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1a840 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1a850 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1a860 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1a870 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1a880 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1a890 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1a8a0 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1a8b0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1a8c0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1a8d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1a8e0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1a8f0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1a900 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1a910 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1a920 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1a930 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1a940 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1a950 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1a960 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1a970 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1a980 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1a990 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1a9a0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1a9b0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1a9c0 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1a9d0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1a9e0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1a9f0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1aa00 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1aa10 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1aa20 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1aa30 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1aa40 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1aa50 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1aa60 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1aa70 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1aa80 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1aa90 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1aaa0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1aab0 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1aac0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1aad0 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1aae0 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1aaf0 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1ab00 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1ab10 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1ab20 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1ab30 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1ab40 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1ab50 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1ab60 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1ab70 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1ab80 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1ab90 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1aba0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1abb0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1abc0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1abd0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1abe0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1abf0 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1ac00 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1ac10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1ac20 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1ac30 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1ac40 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1ac50 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1ac60 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1ac70 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1ac80 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1ac90 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1aca0 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1acb0 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1acc0 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1acd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1ace0 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1acf0 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1ad00 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1ad10 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1ad20 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1ad30 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1ad40 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1ad50 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1ad60 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1ad70 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1ad80 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1ad90 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1ada0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1adb0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1adc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1add0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1ade0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1adf0 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1ae00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ae10 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1ae20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1ae30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ae40 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1ae50 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1ae60 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1ae70 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1ae80 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1ae90 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1aea0 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1aeb0 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1aec0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1aed0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1aee0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1aef0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1af00 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1af10 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1af20 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1af30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1af40 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1af50 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1af60 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1af70 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1af80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1af90 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1afa0 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1afb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1afc0 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1afd0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1afe0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1aff0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1b000 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1b010 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b020 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1b030 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1b040 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1b050 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b060 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1b080 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
1b090 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
1b0a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b0b0 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
1b0c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1b0d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b0e0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
1b0f0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b100 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
1b110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b120 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1b130 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b140 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
1b150 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
1b160 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1b180 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1b190 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1b1a0 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
1b1b0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
1b1c0 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
1b1d0 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
1b1e0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
1b1f0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
1b200 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
1b210 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
1b220 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
1b230 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
1b240 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
1b250 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
1b260 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
1b270 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
1b280 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
1b290 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
1b2a0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
1b2b0 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
1b2c0 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
1b2d0 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
1b2e0 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
1b2f0 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
1b300 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
1b310 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
1b320 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
1b330 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1b340 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
1b350 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
1b360 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
1b370 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
1b380 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
1b390 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
1b3a0 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
1b3b0 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
1b3c0 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
1b3d0 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
1b3e0 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
1b3f0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
1b400 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1b410 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
1b420 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
1b430 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
1b440 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
1b450 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
1b460 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
1b470 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
1b480 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
1b490 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
1b4a0 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
1b4b0 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
1b4c0 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
1b4d0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1b4e0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1b4f0 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
1b500 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
1b510 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
1b520 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b530 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
1b540 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
1b550 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
1b560 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
1b570 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
1b580 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
1b590 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
1b5a0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
1b5b0 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
1b5c0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1b5d0 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
1b5e0 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
1b5f0 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
1b600 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
1b610 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
1b620 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
1b630 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
1b640 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
1b650 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
1b660 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
1b670 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1b680 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1b690 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
1b6a0 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
1b6b0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1b6c0 20 69 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29   if( pBtree==0 )
1b6d0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1b6e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1b6f0 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  ree);.  for(p=pB
1b700 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
1b710 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1b720 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
1b730 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1b740 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
1b750 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
1b760 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
1b770 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
1b780 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
1b790 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
1b7a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1b7b0 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
1b7c0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
1b7d0 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
1b7e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1b7f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b800 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
1b810 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
1b820 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
1b830 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
1b840 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
1b850 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
1b860 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
1b870 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
1b880 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
1b890 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
1b8a0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b8b0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
1b8c0 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
1b8d0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
1b8e0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
1b8f0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
1b900 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b910 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
1b920 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1b930 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
1b940 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
1b950 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
1b960 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
1b970 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
1b980 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20  int tripCode){. 
1b990 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1b9a0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1b9b0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
1b9c0 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
1b9d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1b9e0 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
1b9f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ba00 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
1ba10 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1ba20 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c  Bt, 0, 0);.  }el
1ba30 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
1ba40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1ba50 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
1ba60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
1ba70 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
1ba80 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20  tripCode);.  }. 
1ba90 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1baa0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
1bab0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1bac0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1bad0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
1bae0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
1baf0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1bb00 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
1bb10 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1bb20 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
1bb30 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1bb40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bb50 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1bb60 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
1bb70 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
1bb80 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
1bb90 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
1bba0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
1bbb0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
1bbc0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
1bbd0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
1bbe0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
1bbf0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
1bc00 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
1bc10 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1bc20 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 2c 20   1, &pPage1, 0, 
1bc30 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
1bc40 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
1bc50 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
1bc60 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
1bc70 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
1bc80 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
1bc90 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
1bca0 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
1bcb0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1bcc0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1bcd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bce0 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
1bcf0 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
1bd00 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
1bd10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1bd20 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
1bd30 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
1bd40 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70  ntWriteCursors(p
1bd50 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42  Bt)==0 );.    pB
1bd60 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1bd70 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1bd80 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1bd90 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1bda0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1bdb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1bdc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
1bdd0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
1bde0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
1bdf0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
1be00 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c   can can be roll
1be10 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
1be20 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
1be30 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1be40 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
1be50 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1be60 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
1be70 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
1be80 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1be90 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
1bea0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
1beb0 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
1bec0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
1bed0 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
1bee0 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
1bef0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
1bf00 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
1bf10 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
1bf20 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
1bf30 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
1bf40 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
1bf50 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
1bf60 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
1bf70 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
1bf80 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
1bf90 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
1bfa0 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
1bfb0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
1bfc0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
1bfd0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1bfe0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
1bff0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
1c000 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
1c010 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
1c020 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1c030 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
1c040 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
1c050 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
1c060 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
1c070 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
1c080 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1c090 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
1c0a0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
1c0b0 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
1c0c0 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
1c0d0 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
1c0e0 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
1c0f0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
1c100 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
1c110 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
1c120 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
1c130 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
1c140 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
1c150 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
1c160 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
1c170 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
1c180 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
1c190 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
1c1a0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1c1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1c1c0 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
1c1d0 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
1c1e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1c1f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1c200 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
1c210 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1c220 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
1c230 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1c240 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
1c250 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1c260 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
1c270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1c280 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
1c290 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1c2a0 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
1c2b0 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
1c2c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c2d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1c2e0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
1c2f0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
1c300 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1c310 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
1c320 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
1c330 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
1c340 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
1c350 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
1c360 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
1c370 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
1c380 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
1c390 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
1c3a0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
1c3b0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
1c3c0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
1c3d0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1c3e0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1c3f0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
1c400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c410 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1c420 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
1c430 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
1c440 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c450 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c460 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1c470 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1c480 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
1c490 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
1c4a0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
1c4b0 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
1c4c0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
1c4d0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
1c4e0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
1c4f0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
1c500 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
1c510 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
1c520 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
1c530 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
1c540 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
1c550 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
1c560 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
1c570 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1c580 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
1c590 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
1c5a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
1c5b0 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
1c5c0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
1c5d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1c5e0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
1c5f0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
1c600 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
1c610 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
1c620 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
1c630 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
1c640 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
1c650 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
1c660 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
1c670 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
1c680 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
1c690 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c6a0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
1c6b0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
1c6c0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
1c6d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c6e0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
1c6f0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1c700 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1c710 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c720 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1c730 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
1c740 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
1c750 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1c760 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
1c770 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
1c780 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
1c790 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
1c7a0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
1c7b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1c7c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
1c7d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c7e0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
1c7f0 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
1c800 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
1c810 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c820 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
1c830 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42  vepoint<0 && (pB
1c840 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1c850 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1c860 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1c870 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b   pBt->nPage = 0;
1c880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1c890 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1c8a0 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
1c8b0 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
1c8c0 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
1c8d0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
1c8e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1c8f0 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
1c900 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
1c910 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
1c920 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
1c930 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1c940 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
1c950 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1c960 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
1c970 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
1c980 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
1c990 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
1c9a0 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
1c9b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1c9c0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1c9d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c9e0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1c9f0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
1ca00 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
1ca10 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
1ca20 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
1ca30 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
1ca40 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
1ca50 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1ca60 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
1ca70 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
1ca80 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
1ca90 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1caa0 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
1cab0 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
1cac0 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
1cad0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
1cae0 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
1caf0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
1cb00 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
1cb10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1cb20 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
1cb30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1cb40 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
1cb50 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
1cb60 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
1cb70 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1cb80 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
1cb90 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
1cba0 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
1cbb0 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
1cbc0 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
1cbd0 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
1cbe0 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
1cbf0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
1cc00 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
1cc10 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
1cc20 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
1cc30 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
1cc40 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
1cc50 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
1cc60 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
1cc70 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
1cc80 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
1cc90 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
1cca0 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
1ccb0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
1ccc0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
1ccd0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
1cce0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
1ccf0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
1cd00 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
1cd10 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
1cd20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
1cd30 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
1cd40 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
1cd50 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
1cd60 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
1cd70 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
1cd80 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
1cd90 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
1cda0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1cdb0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
1cdc0 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
1cdd0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
1cde0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
1cdf0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
1ce00 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
1ce10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1ce20 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
1ce30 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
1ce40 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
1ce50 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
1ce60 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
1ce70 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
1ce80 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
1ce90 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
1cea0 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
1ceb0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1cec0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
1ced0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
1cee0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1cef0 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
1cf00 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
1cf10 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
1cf20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
1cf30 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
1cf40 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1cf50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
1cf60 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
1cf70 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf90 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1cfa0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1cfb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cfd0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1cfe0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1cff0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d010 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1d020 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1d030 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1d040 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1d050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1d060 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
1d070 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1d080 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
1d090 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d0b0 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
1d0c0 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
1d0d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d0e0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1d0f0 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
1d100 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
1d110 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1d120 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1d130 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
1d140 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1d150 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20  wrFlag==1 );..  
1d160 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1d170 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
1d180 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
1d190 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
1d1a0 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
1d1b0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1d1c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
1d1d0 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
1d1e0 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
1d1f0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
1d200 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1d210 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
1d220 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
1d230 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
1d240 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
1d250 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1d260 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1d270 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
1d280 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67  yInfo!=0, wrFlag
1d290 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
1d2a0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
1d2b0 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1d2c0 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
1d2d0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
1d2e0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
1d2f0 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
1d300 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
1d310 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1d320 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
1d330 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
1d340 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
1d350 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1d360 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
1d370 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
1d380 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1d390 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ata );..  if( NE
1d3a0 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28 70  VER(wrFlag && (p
1d3b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1d3c0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1d3d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1d3e0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1d3f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1d400 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
1d410 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1d420 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
1d430 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
1d440 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
1d450 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1d460 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1d470 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1d480 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1d490 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1d4a0 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1d4b0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1d4c0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1d4d0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1d4e0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1d4f0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1d500 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1d510 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1d520 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1d530 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1d540 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1d550 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
1d560 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
1d570 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1d580 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1d590 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1d5a0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1d5b0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1d5c0 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1d5d0 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1d5e0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1d5f0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
1d600 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
1d610 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1d620 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1d630 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1d640 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1d680 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d6b0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1d6c0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1d6d0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d700 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1d710 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1d720 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1d730 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1d740 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1d750 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1d760 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1d770 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1d7a0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1d7b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1d7c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1d7d0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1d7e0 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1d7f0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1d800 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1d810 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1d820 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1d830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d840 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1d850 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1d860 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1d870 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1d880 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1d890 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1d8a0 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1d8b0 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1d8c0 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1d8d0 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1d8e0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1d8f0 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1d900 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1d910 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1d920 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1d930 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1d940 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1d950 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d960 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1d970 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1d980 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
1d990 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
1d9a0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
1d9b0 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
1d9c0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1d9d0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1d9e0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
1d9f0 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
1da00 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
1da10 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
1da20 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
1da30 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
1da40 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
1da50 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
1da60 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
1da70 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
1da80 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
1da90 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
1daa0 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
1dab0 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
1dac0 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
1dad0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1dae0 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
1daf0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1db00 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1db10 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
1db20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
1db30 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
1db40 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
1db50 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68  .** Set the cach
1db60 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f  ed rowid value o
1db70 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69  f every cursor i
1db80 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
1db90 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70  ase file.** as p
1dba0 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74  Cur and having t
1dbb0 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67  he same root pag
1dbc0 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72  e number as pCur
1dbd0 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a  .  The value is.
1dbe0 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64  ** set to iRowid
1dbf0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73  ..**.** Only pos
1dc00 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75  itive rowid valu
1dc10 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1dc20 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73  d valid for this
1dc30 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63   cache..** The c
1dc40 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69  ache is initiali
1dc50 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64  zed to zero, ind
1dc60 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c  icating an inval
1dc70 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62  id cache..** A b
1dc80 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66  tree will work f
1dc90 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72  ine with zero or
1dca0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1dcb0 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f  .  We just canno
1dcc0 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20  t.** cache zero 
1dcd0 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1dce0 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  ds, which means 
1dcf0 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20  tables that use 
1dd00 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74  zero or.** negat
1dd10 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74  ive rowids might
1dd20 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
1dd30 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72  ower.  But in pr
1dd40 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20  actice, zero.** 
1dd50 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1dd60 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f  ds are very unco
1dd70 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f  mmon so this sho
1dd80 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f  uld not be a pro
1dd90 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
1dda0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
1ddb0 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1ddc0 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33  r *pCur, sqlite3
1ddd0 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a  _int64 iRowid){.
1dde0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1ddf0 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74   for(p=pCur->pBt
1de00 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1de10 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1de20 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
1de30 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
1de40 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20   p->cachedRowid 
1de50 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20  = iRowid;.  }.  
1de60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61  assert( pCur->ca
1de70 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69  chedRowid==iRowi
1de80 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  d );.}../*.** Re
1de90 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20  turn the cached 
1dea0 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67 69  rowid for the gi
1deb0 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e  ven cursor.  A n
1dec0 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a  egative or zero.
1ded0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1dee0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1def0 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 69  he rowid cache i
1df00 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  s invalid and sh
1df10 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72  ould be.** ignor
1df20 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69  ed.  If the rowi
1df30 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76 65  d cache has neve
1df40 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65  r before been se
1df50 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72  t, then a.** zer
1df60 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
1df70 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1df80 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43  sqlite3BtreeGetC
1df90 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1dfa0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
1dfb0 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65  turn pCur->cache
1dfc0 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dRowid;.}../*.**
1dfd0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
1dfe0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
1dff0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1e000 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
1e010 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
1e020 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
1e030 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1e040 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
1e050 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
1e060 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
1e070 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
1e080 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
1e090 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1e0a0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1e0b0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
1e0c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1e0d0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1e0e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1e0f0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1e100 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
1e110 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
1e120 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
1e130 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1e140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e150 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1e160 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1e170 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1e180 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
1e190 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1e1a0 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
1e1b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1e1c0 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
1e1d0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1e1e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1e1f0 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1e200 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
1e210 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1e220 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  ;.    invalidate
1e230 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
1e240 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ur);.    /* sqli
1e250 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
1e260 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
1e270 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1e280 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1e290 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e2a0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1e2b0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
1e2c0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1e2d0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
1e2e0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
1e2f0 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
1e300 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
1e310 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
1e320 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
1e330 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
1e340 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1e350 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
1e360 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1e370 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
1e380 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
1e390 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
1e3a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1e3b0 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
1e3c0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
1e3d0 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
1e3e0 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
1e3f0 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
1e400 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
1e410 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1e420 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
1e430 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
1e440 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1e450 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
1e460 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
1e470 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
1e480 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
1e490 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
1e4a0 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
1e4b0 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
1e4c0 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
1e4d0 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
1e4e0 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1e4f0 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
1e500 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
1e510 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
1e520 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
1e530 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
1e540 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
1e550 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
1e560 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
1e570 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
1e580 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1e590 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1e5a0 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
1e5b0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1e5c0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1e5d0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
1e5e0 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
1e5f0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
1e600 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1e610 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1e620 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
1e630 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
1e640 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
1e650 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1e660 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1e670 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1e680 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1e690 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1e6a0 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1e6b0 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1e6c0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1e6d0 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1e6e0 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1e6f0 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1e700 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1e710 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1e720 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e730 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1e740 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1e750 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1e760 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1e770 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1e780 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1e790 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1e7a0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1e7b0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1e7c0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1e7d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e7e0 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1e7f0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
1e800 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
1e810 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
1e820 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
1e830 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
1e840 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
1e850 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
1e860 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
1e870 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
1e880 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
1e8c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1e8d0 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1e910 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1e920 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1e960 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1e970 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1e980 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1e990 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1e9a0 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d  fo); \.    pCur-
1e9b0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
1ea50 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1ea60 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
1eaa0 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
1eab0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
1eac0 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
1ead0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
1eae0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1eaf0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1eb00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1eb10 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
1eb20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
1eb30 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
1eb40 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
1eb50 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1eb60 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
1eb70 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
1eb80 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
1eb90 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
1eba0 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
1ebb0 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1ebc0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1ebd0 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
1ebe0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1ebf0 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
1ec00 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1ec10 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
1ec20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1ec30 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
1ec40 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1ec50 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1ec60 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1ec70 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
1ec80 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
1ec90 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
1eca0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1ecb0 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
1ecc0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1ecd0 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
1ece0 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
1ecf0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
1ed00 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
1ed10 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
1ed20 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
1ed30 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1ed40 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
1ed50 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
1ed60 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
1ed70 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
1ed80 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
1ed90 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
1eda0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1edb0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1edc0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
1edd0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
1ede0 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
1edf0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
1ee00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ee10 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
1ee20 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
1ee30 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1ee40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ee50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1ee60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1ee70 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1ee80 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1ee90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1eea0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1eeb0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
1eec0 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  LID ){.    *pSiz
1eed0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1eee0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1eef0 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a  pCur);.    *pSiz
1ef00 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1ef10 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Key;.  }.  retur
1ef20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ef30 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1ef40 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1ef50 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1ef60 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
1ef70 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
1ef80 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
1ef90 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1efa0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
1efb0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1efc0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
1efd0 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
1efe0 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
1eff0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1f000 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
1f010 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
1f020 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
1f030 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
1f040 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f050 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
1f060 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
1f070 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
1f080 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
1f090 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
1f0a0 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
1f0b0 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
1f0c0 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
1f0d0 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
1f0e0 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
1f0f0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
1f100 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
1f110 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
1f120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f130 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
1f140 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1f150 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1f160 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f170 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f190 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f1a0 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
1f1b0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
1f1c0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1f1d0 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e  .nData;.  return
1f1e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f1f0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
1f200 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
1f210 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1f220 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
1f230 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
1f240 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
1f250 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
1f260 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1f270 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1f280 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
1f290 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
1f2a0 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
1f2b0 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
1f2c0 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
1f2d0 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
1f2e0 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
1f2f0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1f300 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
1f310 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
1f320 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
1f330 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1f340 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1f350 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
1f360 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1f370 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
1f380 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1f390 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
1f3a0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
1f3b0 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
1f3c0 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
1f3d0 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
1f3e0 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
1f3f0 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
1f400 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
1f410 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
1f420 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
1f430 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1f440 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
1f450 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1f460 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
1f470 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
1f480 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
1f490 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1f4a0 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
1f4b0 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
1f4c0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1f4d0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1f4e0 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
1f4f0 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
1f500 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
1f510 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
1f520 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
1f530 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
1f540 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1f550 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
1f560 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
1f570 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
1f580 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
1f590 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
1f5a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1f5b0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
1f5c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f5e0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
1f5f0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
1f600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f610 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
1f620 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1f630 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
1f640 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
1f650 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
1f660 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
1f670 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
1f680 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f6a0 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
1f6b0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1f6c0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
1f6d0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1f6e0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
1f6f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f700 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1f710 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1f720 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1f730 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
1f740 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
1f750 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f760 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
1f770 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
1f780 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1f790 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
1f7a0 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
1f7b0 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
1f7c0 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
1f7d0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1f7e0 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
1f7f0 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
1f800 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
1f810 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
1f820 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
1f830 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
1f840 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
1f850 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
1f860 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
1f870 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
1f880 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
1f890 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
1f8a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1f8b0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
1f8c0 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
1f8d0 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
1f8e0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
1f8f0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1f900 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
1f910 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
1f920 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f930 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
1f940 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
1f950 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
1f960 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1f970 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
1f980 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1f990 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
1f9a0 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
1f9b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f9c0 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
1f9d0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
1f9e0 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
1f9f0 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
1fa00 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
1fa10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1fa20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fa30 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1fa40 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
1fa50 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1fa60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fa70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1fa80 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1fa90 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
1faa0 30 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 29 3b  0, (ppPage==0));
1fab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
1fac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1fad0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
1fae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1faf0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
1fb00 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1fb10 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
1fb20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
1fb30 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
1fb40 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
1fb50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
1fb60 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
1fb70 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1fb80 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
1fb90 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
1fba0 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
1fbb0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
1fbc0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1fbd0 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
1fbe0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
1fbf0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
1fc00 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
1fc10 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
1fc20 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
1fc30 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
1fc40 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
1fc50 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
1fc60 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
1fc70 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
1fc80 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
1fc90 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1fca0 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
1fcb0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
1fcc0 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
1fcd0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1fce0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
1fcf0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
1fd00 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
1fd10 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
1fd20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
1fd30 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
1fd40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fd50 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
1fd60 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
1fd70 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1fd80 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
1fd90 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
1fda0 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
1fdb0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1fdc0 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
1fdd0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1fde0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1fdf0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
1fe00 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1fe20 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1fe30 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
1fe40 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
1fe50 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
1fe60 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
1fe70 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
1fe80 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
1fe90 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
1fea0 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
1feb0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
1fec0 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
1fed0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1fee0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
1fef0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
1ff00 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
1ff10 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
1ff20 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
1ff30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ff40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ff50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ff60 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
1ff70 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
1ff80 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
1ff90 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1ffa0 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
1ffb0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
1ffc0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
1ffd0 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
1ffe0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
1fff0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20000 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
20010 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
20020 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
20030 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
20040 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
20050 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
20060 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
20070 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
20080 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
20090 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
200a0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
200b0 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
200c0 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
200d0 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
200e0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
200f0 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
20100 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
20110 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
20120 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
20130 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
20140 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
20150 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
20160 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
20170 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
20180 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
20190 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
201a0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
201b0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
201c0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
201d0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
201e0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
201f0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
20200 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
20210 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
20220 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
20230 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
20240 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
20250 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
20260 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
20270 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
20280 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
20290 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
202a0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
202b0 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
202c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
202d0 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
202e0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
202f0 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
20300 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
20310 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
20320 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
20330 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
20340 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
20350 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
20360 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
20370 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
20380 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
20390 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
203a0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
203b0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
203c0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
203d0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
203e0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
203f0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
20400 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
20410 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
20420 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
20430 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
20440 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
20450 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
20460 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
20470 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
20480 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
20490 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
204a0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
204b0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
204c0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
204d0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
204e0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
204f0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
20500 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
20510 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
20520 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
20530 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
20540 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
20550 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
20560 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
20570 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
20580 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
20590 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205b0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
205c0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
205d0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
205e0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
205f0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
20600 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20620 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
20630 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
20640 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
20650 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
20660 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
20670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
20680 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
20690 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
206a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
206b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
206c0 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
206d0 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
206e0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
206f0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
20700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20710 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
20720 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
20730 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
20740 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
20750 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
20760 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
20770 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20780 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20790 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
207a0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
207b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
207c0 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
207d0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
207e0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
207f0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
20800 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
20810 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
20820 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
20830 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
20840 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e  .nKey);..  if( N
20850 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20  EVER(offset+amt 
20860 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
20870 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20  o.nData) .   || 
20880 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
20890 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
208a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
208b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
208c0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
208d0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
208e0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
208f0 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
20900 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
20910 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20920 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
20930 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
20940 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
20950 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
20960 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
20970 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
20980 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
20990 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
209a0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
209b0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
209c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
209d0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
209e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
209f0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
20a00 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
20a10 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
20a20 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
20a30 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
20a40 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
20a50 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
20a60 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
20a70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
20a80 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
20a90 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
20aa0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20ab0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
20ac0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
20ad0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
20ae0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
20af0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
20b00 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
20b10 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
20b20 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
20b30 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
20b40 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
20b50 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
20b60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20b70 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
20b80 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
20b90 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
20ba0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
20bb0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
20bc0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
20bd0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
20be0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
20bf0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
20c00 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
20c10 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
20c20 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
20c30 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
20c40 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
20c50 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
20c60 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
20c70 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
20c80 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
20c90 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
20ca0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
20cb0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
20cc0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
20cd0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
20ce0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
20cf0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
20d00 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
20d10 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
20d20 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
20d30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
20d40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
20d50 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
20d60 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
20d70 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
20d80 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
20d90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
20da0 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
20db0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
20dc0 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
20dd0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a  nOvfl);.      /*
20de0 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73   nOvfl is always
20df0 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69   positive.  If i
20e00 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74  t were zero, fet
20e10 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20  chPayload would 
20e20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  have.      ** be
20e30 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  en used instead 
20e40 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
20e50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
20e60 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21  WAYS(nOvfl) && !
20e70 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
20e80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20e90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
20ea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
20eb0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
20ec0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
20ed0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
20ee0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
20ef0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
20f00 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
20f10 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
20f20 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
20f30 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
20f40 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
20f50 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
20f60 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
20f70 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
20f80 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
20f90 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
20fa0 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
20fb0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
20fc0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
20fd0 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
20fe0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
20ff0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
21000 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
21010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21020 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
21030 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
21040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21050 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
21060 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
21070 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
21080 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
21090 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
210a0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
210b0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
210c0 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
210d0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
210e0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
210f0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
21100 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
21110 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
21120 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
21130 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
21140 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
21150 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
21160 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
21170 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
21180 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
21190 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
211a0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
211b0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
211c0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
211d0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
211e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
211f0 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
21200 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
21210 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
21220 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
21230 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
21240 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
21250 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
21260 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
21270 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
21280 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
21290 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
212a0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
212b0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
212c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
212d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
212e0 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
212f0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
21300 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
21310 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
21320 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
21330 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
21340 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
21350 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
21360 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
21370 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
21380 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
21390 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
213a0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
213b0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
213c0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
213d0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
213e0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
213f0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
21400 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
21410 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
21420 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
21430 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
21440 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
21450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21460 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69  _file *fd;.#endi
21470 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
21480 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
21490 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
214a0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
214b0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
214c0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
214d0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
214e0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
214f0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
21500 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
21510 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
21520 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
21530 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
21540 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
21550 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
21560 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
21570 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
21580 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
21590 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
215a0 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
215b0 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61    **   3) the da
215c0 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62  tabase is file-b
215d0 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20  acked, and.     
215e0 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65     **   4) there
215f0 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74   is no open writ
21600 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e-transaction, a
21610 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
21620 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  5) the database 
21630 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74  is not a WAL dat
21640 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a  abase,.        *
21650 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
21660 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
21670 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
21680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21690 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
216a0 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
216b0 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
216c0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
216d0 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
216e0 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
216f0 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
21700 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
21710 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
21720 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
21730 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
21740 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20   eOp==0         
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
21780 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
21790 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
217c0 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
217d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
217e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
217f0 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
21800 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
21810 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
21820 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
21830 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
21840 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
21850 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
21860 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31    && pBt->pPage1
21870 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30  ->aData[19]==0x0
21880 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
21890 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
218a0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
218b0 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
218c0 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
218d0 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
218e0 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
218f0 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
21900 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
21910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21920 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
21930 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
21940 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
21950 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
21960 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
21970 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
21980 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
21990 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
219a0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
219b0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
219c0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
219d0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
219e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
219f0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
21a00 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
21a10 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
21a20 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
21a30 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45    (eOp==0 ? PAGE
21a40 52 5f 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e  R_ACQUIRE_READON
21a50 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
21a60 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
21a70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21a80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21a90 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
21aa0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
21ab0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21ac0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
21ad0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
21ae0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
21af0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
21b00 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
21b10 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
21b20 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
21b30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21b40 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
21b50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
21b60 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
21b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21b80 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
21b90 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
21ba0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
21bb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
21bc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21bd0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
21be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21bf0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
21c00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21c10 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
21c20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
21c30 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
21c40 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
21c50 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
21c60 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
21c70 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
21c80 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
21c90 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
21ca0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
21cb0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
21cc0 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
21cd0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
21ce0 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
21cf0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
21d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
21d10 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
21d20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
21d30 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
21d40 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
21d50 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
21d60 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
21d70 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
21d80 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
21d90 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
21da0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
21db0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
21dc0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
21dd0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
21de0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
21df0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
21e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
21e10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21e20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
21e30 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
21e40 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
21e50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
21e60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21e70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21e80 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
21e90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21ea0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
21eb0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
21ec0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
21ed0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
21ee0 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
21ef0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
21f00 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
21f10 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
21f20 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
21f30 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
21f40 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
21f50 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
21f60 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
21f70 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
21f80 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
21f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
21fa0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
21fb0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
21fc0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
21fd0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
21fe0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
21ff0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
22000 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
22010 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
22020 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
22030 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
22040 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
22050 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
22060 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
22070 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
22080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
22090 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
220a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
220b0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
220c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
220d0 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
220e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
220f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
22100 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
22110 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
22120 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
22130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
22150 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22160 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
22170 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
22180 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
22190 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
221a0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
221b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
221c0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
221d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
221e0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
221f0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
22200 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
22210 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
22220 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22230 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
22240 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22250 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
22260 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
22270 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
22280 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
22290 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
222a0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
222b0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
222c0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
222d0 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
222e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
222f0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
22300 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
22310 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
22320 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
22330 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
22340 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
22350 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
22360 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
22370 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
22380 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
22390 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
223a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
223b0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
223c0 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
223d0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
223e0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
223f0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
22400 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
22410 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
22420 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
22430 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
22440 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
22450 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
22460 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
22470 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
22480 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
22490 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
224a0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
224b0 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
224c0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
224d0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
224e0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
224f0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
22500 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
22510 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
22520 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
22530 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
22540 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
22550 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
22560 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
22570 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
22580 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
22590 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
225a0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
225b0 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
225c0 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
225d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
225e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
225f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
22600 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
22610 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22620 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
22630 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
22640 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
22650 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
22660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
22670 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
22680 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
22690 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
226a0 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
226b0 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
226c0 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
226d0 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
226e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
226f0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
22700 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
22710 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
22720 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
22730 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
22740 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
22750 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22760 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
22770 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22780 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22790 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
227a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
227b0 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
227c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
227d0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
227e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
227f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
22800 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
22810 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
22820 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29  ->info.nSize==0)
22830 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72   ){.    btreePar
22840 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
22850 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22860 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
22870 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
22890 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
228a0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
228b0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
228c0 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
228d0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
228e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
228f0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
22900 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
22910 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
22920 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
22930 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
22940 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
22950 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
22960 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
22970 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
22980 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
22990 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
229a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
229b0 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d  assert( nLocal<=
229c0 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70  nKey );.  }.  *p
229d0 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
229e0 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
229f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
22a00 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
22a10 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
22a20 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
22a30 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
22a40 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
22a50 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
22a60 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
22a70 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
22a80 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
22a90 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
22aa0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
22ab0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
22ac0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
22ad0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
22ae0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
22af0 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
22b00 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
22b10 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
22b20 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
22b30 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
22b40 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
22b50 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
22b60 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
22b70 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
22b80 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
22b90 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
22ba0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
22bb0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
22bc0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
22bd0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
22be0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
22bf0 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
22c00 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
22c10 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
22c20 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
22c30 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
22c40 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
22c50 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
22c60 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
22c70 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
22c80 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
22c90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22ca0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22cb0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
22cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
22cd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22ce0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
22cf0 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
22d00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
22d10 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
22d20 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
22d30 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
22d40 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
22d50 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n p;.}.const voi
22d60 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
22d70 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
22d80 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
22d90 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
22da0 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
22db0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22dc0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22dd0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
22de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
22df0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22e00 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
22e10 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
22e20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
22e30 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
22e40 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
22e50 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
22e60 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
22e70 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n p;.}.../*.** M
22e80 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
22e90 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
22ea0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
22eb0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
22ec0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
22ed0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
22ee0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
22ef0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
22f00 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
22f10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
22f20 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
22f30 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
22f40 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
22f50 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
22f60 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
22f70 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
22f80 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
22f90 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
22fa0 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
22fb0 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
22fc0 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
22fd0 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
22fe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
22ff0 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
23000 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
23010 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
23020 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
23030 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
23040 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
23050 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23060 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
23070 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23080 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23090 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
230a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
230b0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
230c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
230d0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
230e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
230f0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
23100 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
23110 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
23120 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
23130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23140 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
23150 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
23160 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
23170 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20  gno, &pNewPage, 
23180 28 70 43 75 72 2d 3e 77 72 46 6c 61 67 3d 3d 30  (pCur->wrFlag==0
23190 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ));.  if( rc ) r
231a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72  eturn rc;.  pCur
231b0 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20  ->apPage[i+1] = 
231c0 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
231d0 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30  ->aiIdx[i+1] = 0
231e0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
231f0 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  +;..  pCur->info
23200 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
23210 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
23220 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  0;.  if( pNewPag
23230 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e  e->nCell<1 || pN
23240 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d  ewPage->intKey!=
23250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
23260 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
23270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
23280 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
23290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
232a0 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  K;.}..#if 0./*.*
232b0 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
232c0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
232d0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
232e0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
232f0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
23300 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
23310 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
23320 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
23330 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
23340 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
23350 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
23360 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
23370 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
23380 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
23390 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
233a0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
233b0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
233c0 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
233d0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
233e0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
233f0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
23400 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
23410 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28  hild){.  assert(
23420 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
23430 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
23440 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
23450 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
23460 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
23470 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
23480 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
23490 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
234a0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
234b0 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
234c0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
234d0 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
234e0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
234f0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
23500 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
23510 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
23520 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
23530 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
23540 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
23550 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
23560 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
23570 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
23580 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
23590 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
235a0 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
235b0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
235c0 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
235d0 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
235e0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
235f0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
23600 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
23610 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
23620 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23630 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
23640 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23650 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23660 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23670 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23680 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23690 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
236a0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
236b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
236c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
236d0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f  ->iPage] );..  /
236e0 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69 73 20  * UPDATE: It is 
236f0 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c  actually possibl
23700 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69 74  e for the condit
23710 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74 68  ion tested by th
23720 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62 65  e assert.  ** be
23730 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75 65  low to be untrue
23740 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
23750 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
23760 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72  . This can occur
23770 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72   if.  ** one cur
23780 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65 64  sor has modified
23790 20 70 61 67 65 20 70 50 61 72 65 6e 74 20 77 68   page pParent wh
237a0 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ile a reference 
237b0 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a 20  to it is held . 
237c0 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64 20   ** by a second 
237d0 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63 61  cursor. Which ca
237e0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
237f0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 69   a single page i
23800 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e  s linked.  ** in
23810 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
23820 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
23830 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64  e in a corrupt d
23840 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66  atabase.  */.#if
23850 20 30 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e   0.  assertParen
23860 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
23870 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23880 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
23890 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
238a0 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
238b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
238c0 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
238d0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65 73   );.#endif.  tes
238e0 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49  tcase( pCur->aiI
238f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
23900 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ] > pCur->apPage
23910 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d  [pCur->iPage-1]-
23920 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c  >nCell );..  rel
23930 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
23940 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23950 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  e]);.  pCur->iPa
23960 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ge--;.  pCur->in
23970 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
23980 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
23990 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
239a0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
239b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
239c0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
239d0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
239e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
239f0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
23a00 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
23a10 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
23a20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
23a30 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
23a40 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
23a50 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
23a60 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
23a70 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
23a80 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
23a90 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
23aa0 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
23ab0 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
23ac0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
23ad0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
23ae0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
23af0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
23b00 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
23b10 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
23b20 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
23b30 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
23b40 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
23b50 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
23b60 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
23b70 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
23b80 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
23b90 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
23ba0 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
23bb0 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
23bc0 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
23bd0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
23be0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
23bf0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
23c00 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
23c10 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
23c20 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
23c30 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
23c40 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
23c50 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
23c60 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
23c70 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
23c80 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
23c90 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
23ca0 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
23cb0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
23cc0 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
23cd0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
23ce0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
23cf0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
23d00 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
23d10 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
23d20 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
23d30 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
23d40 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
23d50 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
23d60 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
23d70 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
23d80 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
23d90 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
23da0 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
23db0 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
23dc0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
23dd0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
23de0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
23df0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
23e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
23e10 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
23e20 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
23e30 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
23e40 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
23e50 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23e60 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23e70 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
23e80 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
23e90 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
23ea0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
23eb0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
23ec0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
23ed0 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
23ee0 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
23ef0 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
23f00 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
23f10 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
23f20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
23f30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23f40 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61  FAULT ){.      a
23f50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
23f60 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b  pNext!=SQLITE_OK
23f70 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
23f80 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
23f90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23fa0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
23fb0 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20  or(pCur);.  }.. 
23fc0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
23fd0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >=0 ){.    int i
23fe0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
23ff0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
24000 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
24010 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
24020 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
24030 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
24040 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
24050 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
24060 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
24070 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
24080 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75  NVALID;.    retu
24090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
240a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
240b0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
240c0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
240d0 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
240e0 65 5b 30 5d 2c 20 70 43 75 72 2d 3e 77 72 46 6c  e[0], pCur->wrFl
240f0 61 67 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20  ag==0);.    if( 
24100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24110 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
24120 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
24130 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
24140 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
24150 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
24160 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75  ;..    /* If pCu
24170 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
24180 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
24190 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
241a0 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
241b0 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64  .    ** expected
241c0 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
241d0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
241e0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
241f0 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a  eyInfo is.    **
24200 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
24210 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
24220 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
24230 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
24240 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e,.    ** return
24250 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
24260 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  PT error.  */.  
24270 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24280 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
24290 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70  y==1 || pCur->ap
242a0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
242b0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
242c0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
242d0 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  )!=pCur->apPage[
242e0 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
242f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24300 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24310 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24320 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
24330 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20  root page is of 
24340 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
24350 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74  . This must be t
24360 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20  he.  ** case as 
24370 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  the call to this
24380 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c   function that l
24390 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70  oaded the root-p
243a0 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a  age (either.  **
243b0 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20   this call or a 
243c0 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74  previous invocat
243d0 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20  ion) would have 
243e0 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
243f0 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  ion .  ** if the
24400 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65   assumption were
24410 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69   not true, and i
24420 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
24430 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20  e for the flags 
24440 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61  .  ** byte to ha
24450 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
24460 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73   while this curs
24470 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  or is holding a 
24480 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74  reference.  ** t
24490 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a  o the page.  */.
244a0 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
244b0 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
244c0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
244d0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
244e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
244f0 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28  oot->isInit && (
24500 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
24510 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)==pRoot->intKe
24520 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69  y );..  pCur->ai
24530 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
24540 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
24550 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
24560 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
24570 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
24580 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
24590 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
245a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
245b0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
245c0 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
245d0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
245e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
245f0 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
24600 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
24610 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
24620 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
24630 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
24640 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
24650 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24660 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
24670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
24680 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
24690 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
246a0 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
246b0 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
246c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
246d0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
246e0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
246f0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
24700 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
24710 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
24720 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
24730 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
24740 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
24750 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
24760 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
24770 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
24780 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
24790 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
247a0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
247b0 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
247c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
247d0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
247e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
247f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
24800 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
24810 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
24820 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
24830 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24840 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
24850 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
24860 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
24870 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24880 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
24890 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
248a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
248b0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
248c0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
248d0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
248e0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
248f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24900 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
24910 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
24920 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
24930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24940 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
24950 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
24960 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
24970 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
24980 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
24990 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
249a0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
249b0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
249c0 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
249d0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
249e0 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
249f0 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
24a00 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
24a10 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
24a20 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
24a30 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
24a40 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
24a50 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
24a60 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24a70 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
24a80 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
24a90 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
24aa0 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
24ab0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
24ac0 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
24ad0 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
24ae0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
24af0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
24b00 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
24b10 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
24b20 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
24b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
24b40 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
24b50 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
24b60 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24b70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24b80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24b90 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
24ba0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
24bb0 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
24bc0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
24bd0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
24be0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
24bf0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
24c00 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
24c10 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
24c20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
24c30 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
24c40 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
24c50 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
24c60 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
24c70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
24c90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24ca0 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
24cb0 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
24cc0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
24cd0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
24ce0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
24cf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24d00 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
24d10 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
24d20 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
24d30 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
24d40 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
24d50 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
24d60 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
24d70 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
24d80 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
24d90 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
24da0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
24db0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
24dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
24dd0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
24de0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
24df0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
24e00 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24e10 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24e20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24e30 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
24e40 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
24e50 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
24e60 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
24e70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
24e90 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24ea0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
24eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
24ec0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
24ed0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
24ee0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24ef0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
24f00 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
24f10 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
24f20 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
24f30 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
24f40 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
24f50 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
24f60 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
24f70 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
24f80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24f90 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
24fa0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
24fb0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
24fc0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
24fd0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
24fe0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
24ff0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
25000 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
25010 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
25020 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
25030 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
25040 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
25050 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25060 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
25070 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
25080 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
25090 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
250a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
250b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
250c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
250d0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
250e0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
250f0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
25100 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
25110 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
25120 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
25130 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
25140 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
25150 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d  >eState && pCur-
25160 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65  >atLast ){.#ifde
25170 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
25180 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
25190 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
251a0 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
251b0 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
251c0 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
251d0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
251e0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
251f0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
25200 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25210 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
25220 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25230 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
25240 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
25250 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
25260 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
25270 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25280 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
25290 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
252a0 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
252b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
252c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
252d0 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
252e0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
252f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
25300 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
25310 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
25320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25330 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
25340 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
25350 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
25360 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
25370 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
25380 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25390 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
253a0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
253b0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
253c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
253d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
253e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
253f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
25400 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
25410 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
25420 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20     pCur->atLast 
25430 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  = rc==SQLITE_OK 
25440 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ?1:0;.    }.  }.
25450 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25460 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
25470 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
25480 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
25490 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
254a0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
254b0 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
254c0 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
254d0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
254e0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
254f0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
25500 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
25510 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
25520 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
25530 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
25540 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
25550 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
25560 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
25570 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
25580 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
25590 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
255a0 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
255b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
255c0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
255d0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
255e0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
255f0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
25600 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
25610 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
25620 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
25630 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
25640 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
25650 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
25660 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
25670 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
25680 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
25690 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
256a0 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
256b0 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
256c0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
256d0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
256e0 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
256f0 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
25700 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
25710 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
25720 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
25730 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
25740 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
25750 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
25760 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
25770 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
25780 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
25790 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
257a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
257b0 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
257c0 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
257d0 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
257e0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
257f0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
25800 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
25810 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
25820 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
25840 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
25850 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
25860 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
25870 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
25880 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
25890 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
258a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
258b0 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
258c0 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
258d0 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
258e0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
258f0 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
25900 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
25910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
25920 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
25930 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
25940 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
25950 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
25960 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
25970 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
25980 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
25990 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
259a0 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
259b0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
259c0 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
259d0 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
259e0 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
259f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
25a00 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
25a10 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
25a20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
25a30 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25a40 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25a50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
25a60 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
25a70 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
25a80 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
25a90 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
25aa0 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
25ab0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
25ac0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
25ad0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
25ae0 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
25af0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
25b00 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
25b10 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
25b20 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
25b30 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
25b40 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
25b50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25b60 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
25b70 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20  ->validNKey .   
25b80 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
25b90 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
25ba0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
25bb0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
25bc0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
25bd0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
25be0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
25bf0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
25c00 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
25c10 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
25c20 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
25c30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
25c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25c50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
25c60 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
25c70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
25c80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25c90 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
25ca0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
25cb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25cc0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
25cd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
25ce0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
25cf0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25d00 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
25d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25d20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25d30 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
25d40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25d50 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
25d60 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
25d70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
25d80 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
25d90 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
25da0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
25db0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
25dc0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25dd0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
25de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25df0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
25e00 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
25e10 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
25e20 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
25e30 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
25e40 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20 20 20 20  , upr, idx;.    
25e50 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
25e60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
25e70 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
25e80 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
25e90 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20   int c;..    /* 
25ea0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
25eb0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
25ec0 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
25ed0 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
25ee0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
25ef0 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
25f00 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
25f10 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
25f20 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
25f30 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
25f40 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
25f50 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
25f60 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
25f70 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
25f80 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
25f90 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
25fa0 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
25fb0 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
25fc0 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
25fd0 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
25fe0 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
25ff0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
26000 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
26010 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
26020 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
26030 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
26040 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
26050 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26060 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
26070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26080 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
26090 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
260a0 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
260b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
260c0 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
260d0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
260e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
260f0 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
26100 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  = upr);.    }els
26110 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
26120 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26130 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20  ] = (u16)(idx = 
26140 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
26150 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
26160 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
26170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
26190 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
261a0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
261b0 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
261c0 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61 69 49 64   idx==pCur->aiId
261d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  x[pCur->iPage] )
261e0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
261f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26200 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
26210 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
26220 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
26230 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
26240 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
26250 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
26260 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
26270 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
26280 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
26290 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
262a0 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
262b0 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
262c0 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
262d0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
262e0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
262f0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
26300 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
26310 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
26320 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
26330 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
26340 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
26350 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
26360 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
26370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26380 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
26390 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
263a0 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
263b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
263c0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
263d0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
263e0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
263f0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
26400 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
26410 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
26420 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
26430 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
26440 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
26450 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
26460 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
26470 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
26480 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
26490 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
264a0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
264b0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
264c0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
264d0 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
264e0 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
264f0 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
26500 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
26510 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
26520 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
26530 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
26540 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
26550 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
26560 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
26570 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
26580 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
26590 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
265a0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
265b0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
265c0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
265d0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
265e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
265f0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
26600 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
26610 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
26620 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 0a  max1bytePayload.
26630 20 20 20 20 20 20 20 20 20 2f 2a 20 26 26 20 28           /* && (
26640 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29 3c 70 50 61  pCell+nCell)<pPa
26650 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a  ge->aDataEnd */.
26660 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26670 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
26680 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
26690 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
266a0 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
266b0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
266c0 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
266d0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
266e0 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
266f0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
26700 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
26710 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
26720 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
26730 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
26740 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
26750 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
26760 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
26770 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
26780 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
26790 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
267a0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
267b0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
267c0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
267d0 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
267e0 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
267f0 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
26800 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2f  ocal.          /
26810 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c  * && (pCell+nCel
26820 6c 2b 32 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61  l+2)<=pPage->aDa
26830 74 61 45 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  taEnd */.       
26840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
26850 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
26860 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
26870 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
26880 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
26890 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
268a0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
268b0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
268c0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
268d0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
268e0 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
268f0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
26900 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
26910 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
26920 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
26930 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
26940 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26950 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
26960 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
26970 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
26980 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
26990 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
269a0 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
269b0 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
269c0 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
269d0 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
269e0 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
269f0 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
26a00 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
26a10 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
26a20 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
26a30 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
26a40 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
26a50 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
26a60 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
26a70 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
26a80 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
26a90 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
26aa0 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
26ab0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
26ac0 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
26ad0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
26ae0 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
26af0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
26b00 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
26b10 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
26b20 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
26b30 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
26b40 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
26b50 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
26b60 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
26b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
26b80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
26b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26ba0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
26bb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26bc0 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
26bd0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
26be0 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
26bf0 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
26c00 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
26c10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
26c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26c30 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
26c40 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
26c50 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
26c60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26c70 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
26c80 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
26c90 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
26ca0 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
26cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26cc0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
26cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26ce0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
26cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26d00 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
26d10 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
26d20 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
26d30 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
26d40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
26d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26d60 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
26d70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26d80 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
26d90 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
26da0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
26db0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
26dc0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
26dd0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
26de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26df0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
26e00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
26e10 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
26e20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26e30 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
26e40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
26e50 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20 28 6c  = (u16)(idx = (l
26e60 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20  wr+upr)/2);.    
26e70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
26e80 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
26e90 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
26ea0 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
26eb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26ec0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
26ed0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
26ee0 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
26ef0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
26f00 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
26f10 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
26f20 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
26f30 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
26f40 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
26f50 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
26f60 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
26f70 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
26f80 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
26f90 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
26fa0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
26fb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
26fc0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
26fd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26fe0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
26ff0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
27000 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
27010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27020 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
27030 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ish;.    }.    p
27040 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27050 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
27060 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
27070 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
27080 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
27090 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
270a0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
270b0 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
270c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
270d0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
270e0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
270f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
27100 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
27110 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
27120 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
27130 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
27140 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
27150 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
27160 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
27170 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
27180 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
27190 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
271a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
271b0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
271c0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
271d0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
271e0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
271f0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
27200 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
27210 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
27220 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
27230 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
27240 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
27250 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
27260 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
27270 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
27280 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
27290 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
272a0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
272b0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
272c0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
272d0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
272e0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
272f0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
27300 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
27310 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
27320 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
27330 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
27340 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
27350 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
27360 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
27370 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
27380 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
27390 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
273a0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
273b0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
273c0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
273d0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
273e0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
273f0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
27400 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
27410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27420 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
27430 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
27440 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
27450 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
27460 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
27470 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27480 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
27490 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
274a0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
274b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
274c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
274d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
274e0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
274f0 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
27500 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
27510 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
27520 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
27530 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
27540 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
27550 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70  pNext>0 ){.    p
27560 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
27570 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
27580 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
27590 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
275a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
275b0 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
275c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
275d0 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
275e0 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
275f0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
27600 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
27610 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nit );..  /* If 
27620 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27630 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
27640 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
27650 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
27660 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
27670 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
27680 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
27690 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
276a0 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
276b0 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
276c0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
276d0 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
276e0 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
276f0 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
27700 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
27710 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
27720 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
27730 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
27740 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
27750 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
27760 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
27770 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
27780 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
27790 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
277a0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
277b0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
277c0 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
277d0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
277e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
277f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
27800 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
27810 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
27820 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
27830 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
27840 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
27850 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
27860 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
27870 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
27880 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
27890 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
278a0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
278b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
278c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
278d0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
278e0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
278f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
27900 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27910 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
27920 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
27930 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
27940 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
27950 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27960 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
27970 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27980 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
27990 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
279a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
279b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
279c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
279d0 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
279e0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
279f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
27a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
27a10 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
27a20 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
27a30 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
27a40 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
27a50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
27a60 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
27a70 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
27a80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
27a90 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
27aa0 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
27ab0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
27ac0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
27ad0 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
27ae0 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
27af0 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
27b00 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
27b10 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
27b20 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
27b30 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
27b40 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
27b50 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
27b60 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
27b70 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
27b80 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
27b90 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
27ba0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
27bb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
27bc0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
27bd0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27be0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27bf0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
27c00 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
27c10 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
27c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
27c40 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
27c50 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
27c60 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
27c70 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
27c80 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
27c90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27ca0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
27cb0 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
27cc0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
27cd0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
27ce0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
27cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
27d00 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
27d10 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
27d20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27d30 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
27d40 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
27d50 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
27d60 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
27d70 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
27d80 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27d90 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
27da0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
27db0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
27dc0 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
27dd0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27de0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27df0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
27e00 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
27e10 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
27e20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
27e30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27e40 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
27e50 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
27e60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
27e70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
27e80 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
27e90 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
27ea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27eb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
27ec0 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
27ed0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
27ee0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
27ef0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
27f00 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
27f10 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
27f20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27f30 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
27f40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27f50 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
27f60 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
27f70 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
27f80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27f90 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
27fa0 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
27fb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27fc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
27fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
27fe0 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
27ff0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
28000 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
28010 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
28020 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
28030 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
28040 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
28050 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
28060 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
28070 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
28080 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
28090 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
280a0 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
280b0 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
280c0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
280d0 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
280e0 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
280f0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
28100 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
28110 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
28120 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
28130 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
28140 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
28150 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
28160 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
28170 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
28180 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
28190 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
281a0 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
281b0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
281c0 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
281d0 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
281e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
281f0 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
28200 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
28210 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
28220 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
28230 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
28240 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
28250 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
28260 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
28270 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
28280 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
28290 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
282a0 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
282b0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
282c0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
282d0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
282e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
282f0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
28300 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
28310 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
28320 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
28330 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
28340 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
28350 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
28360 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
28370 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
28380 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
28390 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
283a0 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
283b0 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
283c0 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
283d0 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
283e0 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
283f0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
28400 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
28410 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
28420 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
28430 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
28440 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
28450 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
28460 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
28470 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
28480 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
28490 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
284a0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
284b0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
284c0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
284d0 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
284e0 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
284f0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
28500 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
28510 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
28520 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
28530 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
28540 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
28550 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
28560 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
28570 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
28580 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
285a0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
285b0 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
285c0 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
285d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
285e0 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
285f0 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
28600 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
28610 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
28620 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
28630 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
28640 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
28650 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
28660 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
28670 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
28680 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
28690 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
286a0 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
286b0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
286c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
286d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
286e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
286f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
28700 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
28710 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
28720 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74  y>0 && IfNotOmit
28730 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  AV(pBt->autoVacu
28740 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31  um)) );.  pPage1
28750 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
28760 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65    mxPage = btree
28770 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
28780 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
28790 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
287a0 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
287b0 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
287c0 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29   if( n>=mxPage )
287d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
287e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
287f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
28800 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
28810 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
28820 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
28830 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
28840 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
28850 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
28860 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
28870 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
28880 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
28890 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
288a0 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
288b0 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  * If eMode==BTAL
288c0 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20  LOC_EXACT and a 
288d0 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
288e0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
288f0 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
28900 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
28910 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
28920 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
28930 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
28940 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
28950 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
28960 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
28970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28980 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
28990 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
289a0 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
289b0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d      if( nearby<=
289c0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
289d0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
289e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
289f0 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
28a00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
28a10 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
28a20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
28a30 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
28a40 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
28a50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
28a60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
28a70 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
28a80 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
28a90 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
28aa0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
28ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28ac0 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54  se if( eMode==BT
28ad0 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
28ae0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
28af0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
28b00 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
28b10 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
28b20 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
28b30 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
28b40 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
28b50 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
28b60 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
28b70 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
28b80 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
28b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
28ba0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
28bb0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28bc0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28bd0 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
28be0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
28bf0 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
28c00 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
28c10 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
28c20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
28c30 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
28c40 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
28c50 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
28c60 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
28c70 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
28c80 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
28c90 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
28ca0 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
28cb0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
28cc0 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
28cd0 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20  ALLOC_EXACT).   
28ce0 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70   ** or until a p
28cf0 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e  age less than 'n
28d00 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
28d10 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
28d20 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20  C_LT).    */.   
28d30 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
28d40 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
28d50 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
28d60 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
28d70 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
28d80 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
28d90 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
28da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28db0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
28dc0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
28dd0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
28de0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
28df0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
28e00 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
28e10 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  k>mxPage ){.    
28e20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28e50 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
28e60 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
28e70 2c 20 26 70 54 72 75 6e 6b 2c 20 30 2c 20 30 29  , &pTrunk, 0, 0)
28e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28e90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28ea0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
28eb0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
28ec0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
28ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
28ee0 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
28ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28f00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
28f10 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65  );..      k = ge
28f20 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
28f30 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20  aData[4]); /* # 
28f40 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69  of leaves on thi
28f50 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  s trunk page */.
28f60 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
28f70 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
28f80 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28f90 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
28fa0 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
28fb0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
28fc0 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
28fd0 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
28fe0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
28ff0 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
29000 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
29010 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
29020 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
29030 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
29040 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
29050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29060 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
29070 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
29080 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
29090 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
290a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
290b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
290c0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
290d0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
290e0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
290f0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
29100 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29110 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
29120 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
29130 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
29140 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
29150 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
29160 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
29170 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
29180 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
29190 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
291a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
291b0 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
291c0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
291d0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
291e0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
291f0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
29200 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
29210 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
29220 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
29230 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
29240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29250 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
29260 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
29270 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
29280 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
29290 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
292a0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
292b0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
292c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
292d0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
292e0 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
292f0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
29300 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
29310 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
29320 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
29330 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
29340 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
29350 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
29360 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
29370 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
29380 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
29390 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
293a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
293b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
293c0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
293d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
293e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
293f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29400 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
29410 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
29420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29430 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
29440 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
29450 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
29460 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
29470 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29480 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29490 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
294a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
294b0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
294c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
294d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
294e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
294f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29500 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29510 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29520 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29530 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
29540 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
29550 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29580 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
29590 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
295a0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
295b0 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
295c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
295d0 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
295e0 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
295f0 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
29600 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
29610 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
29620 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
29630 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
29640 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
29650 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
29660 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
29670 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
29680 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
29690 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
296a0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
296b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
296c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
296d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
296e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
296f0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
29700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29710 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
29720 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
29730 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
29740 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29750 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
29760 54 72 75 6e 6b 2c 20 30 2c 20 30 29 3b 0a 20 20  Trunk, 0, 0);.  
29770 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29790 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
297a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
297b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
297c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
297d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
297e0 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
297f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29810 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
29820 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
29830 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
29840 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
29850 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
29860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29870 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
29880 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
29890 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
298a0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
298b0 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
298c0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
298d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
298e0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
298f0 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
29900 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
29910 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
29920 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
29930 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
29940 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
29950 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
29960 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
29970 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29980 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
29990 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
299a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
299b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
299c0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
299d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
299e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
299f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29a00 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
29a10 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
29a20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
29a30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
29a40 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
29a50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
29a60 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
29a70 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
29a80 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
29a90 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
29aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29ab0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
29ac0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
29ad0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
29ae0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
29af0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
29b00 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
29b10 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
29b20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
29b30 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
29b40 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
29b50 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
29b60 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
29b70 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
29b80 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
29b90 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
29ba0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
29bb0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
29bc0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
29bd0 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
29be0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
29bf0 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
29c00 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
29c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
29c20 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
29c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
29c40 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
29c50 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
29c70 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
29c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29c90 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
29cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29cd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
29ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
29cf0 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
29d00 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
29d10 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
29d20 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
29d30 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
29d40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
29d50 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
29d60 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
29d70 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
29d80 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
29d90 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
29da0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
29db0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
29dc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
29dd0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
29de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29df0 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
29e00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29e10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
29e40 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
29e50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
29e60 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
29e70 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
29e80 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
29e90 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
29ea0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
29eb0 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
29ec0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
29ed0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
29ee0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
29ef0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
29f00 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
29f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
29f20 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
29f30 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
29f40 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
29f50 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
29f60 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20  Page==nearby || 
29f70 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26  (iPage<nearby &&
29f80 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
29f90 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b  LE)) .        ){
29fa0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
29fb0 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
29fc0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
29fd0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
29fe0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
29ff0 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
2a000 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
2a010 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2a020 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
2a030 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
2a050 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
2a060 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
2a070 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
2a080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a090 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2a0a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2a0b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2a0c0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2a0d0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2a0e0 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
2a0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a100 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
2a110 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
2a120 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
2a130 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a140 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
2a150 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2a160 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
2a170 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
2a180 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
2a190 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
2a1a0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2a1b0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
2a1c0 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
2a1d0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
2a1e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a1f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2a200 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2a210 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
2a220 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
2a230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2a240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
2a260 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
2a270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2a280 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a290 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2a2a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2a2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2a2c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
2a2d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
2a2e0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
2a2f0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
2a300 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
2a310 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
2a320 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
2a330 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
2a340 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
2a350 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
2a360 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
2a370 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
2a380 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
2a390 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
2a3a0 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
2a3b0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
2a3c0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
2a3d0 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
2a3e0 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
2a3f0 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
2a400 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
2a410 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
2a420 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
2a430 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
2a440 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
2a450 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
2a460 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2a470 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
2a480 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
2a490 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
2a4a0 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
2a4b0 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
2a4c0 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
2a4d0 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
2a4e0 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
2a4f0 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
2a500 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
2a510 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
2a520 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
2a530 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
2a540 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
2a550 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
2a560 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
2a570 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
2a580 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
2a590 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
2a5a0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
2a5b0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
2a5c0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
2a5d0 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
2a5e0 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
2a5f0 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
2a600 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
2a610 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
2a620 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
2a630 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
2a640 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a650 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
2a660 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
2a670 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
2a680 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
2a690 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
2a6a0 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
2a6b0 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
2a6c0 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
2a6d0 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
2a6e0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
2a6f0 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
2a700 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
2a710 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2a720 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
2a730 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
2a740 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
2a750 44 6f 54 72 75 6e 63 61 74 65 29 29 3b 0a 0a 20  DoTruncate));.. 
2a760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a770 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
2a780 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2a790 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2a7a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
2a7b0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
2a7c0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
2a7d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2a7e0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
2a7f0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
2a800 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2a810 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
2a820 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2a830 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2a840 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
2a850 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
2a860 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
2a870 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
2a880 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
2a890 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
2a8a0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
2a8b0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
2a8c0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
2a8d0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
2a8e0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
2a8f0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
2a900 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
2a910 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
2a920 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
2a930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
2a940 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
2a950 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2a960 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
2a970 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
2a980 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
2a990 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
2a9a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a9b0 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
2a9c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2a9d0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
2a9e0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2a9f0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
2aa00 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 2c 20  Pg, bNoContent, 
2aa10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2aa20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2aa30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2aa40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2aa50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
2aa60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2aa70 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
2aa80 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2aa90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
2aaa0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
2aab0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2aac0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2aad0 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
2aae0 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
2aaf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
2ab00 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
2ab10 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
2ab20 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
2ab30 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
2ab40 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
2ab50 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2ab60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2ab70 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
2ab80 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2ab90 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2aba0 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 2c  age, bNoContent,
2abb0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
2abc0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2abd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2abe0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
2abf0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
2ac00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ac10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
2ac20 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
2ac30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
2ac40 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2ac50 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
2ac60 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
2ac70 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
2ac80 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
2ac90 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2aca0 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
2acb0 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
2acc0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
2acd0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
2ace0 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  runk);.  if( rc=
2acf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ad00 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
2ad10 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
2ad20 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2ad30 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
2ad40 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
2ad50 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2ad60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ad70 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2ad80 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
2ad90 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
2ada0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
2adb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
2adc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2add0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ade0 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65  iteable((*ppPage
2adf0 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  )->pDbPage) );. 
2ae00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ae10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ae20 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
2ae30 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
2ae40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ae50 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
2ae60 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
2ae70 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
2ae80 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
2ae90 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
2aea0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
2aeb0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
2aec0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2aed0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2aee0 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
2aef0 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
2af00 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
2af10 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
2af20 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2af30 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
2af40 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
2af50 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
2af60 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
2af70 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
2af80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
2af90 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
2afa0 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
2afb0 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
2afc0 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
2afd0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2afe0 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
2aff0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
2b000 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
2b010 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2b020 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
2b030 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
2b040 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
2b050 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
2b060 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
2b070 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
2b080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b090 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2b0a0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
2b0b0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0d0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
2b0e0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2b0f0 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
2b100 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
2b110 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
2b120 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
2b130 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2b140 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b160 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
2b170 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
2b180 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
2b190 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b1b0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2b1c0 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2b1f0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2b200 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
2b210 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2b220 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b230 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2b240 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
2b250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
2b260 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
2b270 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
2b280 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
2b290 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2b2a0 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
2b2b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2b2c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b2d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2b2e0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2b2f0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
2b300 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
2b310 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
2b320 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
2b330 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
2b340 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b350 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2b360 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
2b370 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2b380 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
2b390 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2b3a0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
2b3b0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2b3c0 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
2b3d0 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
2b3e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
2b3f0 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
2b400 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
2b410 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
2b420 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2b430 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
2b440 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
2b450 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
2b460 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
2b470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b480 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
2b490 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2b4a0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
2b4b0 65 2c 20 30 2c 20 30 29 29 21 3d 30 29 20 29 0a  e, 0, 0))!=0) ).
2b4c0 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
2b4d0 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
2b4e0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2b4f0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
2b500 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
2b510 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2b520 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2b530 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
2b540 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
2b550 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
2b560 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2b570 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
2b580 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
2b590 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
2b5a0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
2b5b0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
2b5c0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
2b5d0 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
2b5e0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2b5f0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2b600 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
2b610 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
2b620 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b630 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2b640 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
2b650 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
2b660 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
2b670 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
2b680 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
2b690 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
2b6a0 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
2b6b0 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
2b6c0 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
2b6d0 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
2b6e0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
2b6f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
2b700 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
2b710 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
2b720 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
2b730 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2b740 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2b750 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
2b760 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
2b770 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
2b780 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
2b790 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
2b7a0 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
2b7b0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
2b7c0 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
2b7d0 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
2b7e0 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
2b7f0 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
2b800 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
2b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b820 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
2b830 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
2b840 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
2b850 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
2b860 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2b870 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
2b880 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2b890 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
2b8a0 26 70 54 72 75 6e 6b 2c 20 30 2c 20 30 29 3b 0a  &pTrunk, 0, 0);.
2b8b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b8c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2b8d0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2b8e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
2b8f0 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
2b900 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2b910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
2b920 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
2b930 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
2b940 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
2b950 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
2b960 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2b970 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2b980 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2b990 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2b9a0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
2b9b0 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
2b9c0 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
2b9d0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
2b9e0 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
2b9f0 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
2ba00 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
2ba10 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
2ba20 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
2ba30 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
2ba40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
2ba50 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
2ba60 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
2ba70 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
2ba80 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
2ba90 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2baa0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
2bab0 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
2bac0 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
2bad0 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
2bae0 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
2baf0 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
2bb00 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
2bb10 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
2bb20 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
2bb30 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
2bb40 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2bb50 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
2bb60 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
2bb70 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2bb80 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
2bb90 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
2bba0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
2bbb0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
2bbc0 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
2bbd0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
2bbe0 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
2bbf0 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
2bc00 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
2bc10 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
2bc20 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2bc30 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
2bc40 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
2bc50 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
2bc60 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
2bc70 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
2bc80 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
2bc90 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
2bca0 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
2bcb0 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
2bcc0 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
2bcd0 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2bce0 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
2bcf0 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
2bd00 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
2bd10 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
2bd20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2bd30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2bd40 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2bd50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2bd60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bd70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
2bd80 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2bd90 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
2bda0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
2bdb0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2bdc0 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
2bdd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2bde0 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
2bdf0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
2be00 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
2be10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2be20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2be30 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2be40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2be50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
2be60 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
2be70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2be80 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
2be90 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2bea0 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
2beb0 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
2bec0 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
2bed0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
2bee0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2bef0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2bf00 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
2bf10 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
2bf20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
2bf30 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2bf40 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
2bf50 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
2bf60 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
2bf70 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
2bf80 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2bf90 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
2bfa0 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
2bfb0 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
2bfc0 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
2bfd0 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
2bfe0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2bff0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2c000 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
2c010 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
2c020 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
2c030 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
2c040 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
2c050 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
2c060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
2c070 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
2c080 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
2c090 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
2c0a0 2c 20 26 70 50 61 67 65 2c 20 30 2c 20 30 29 29  , &pPage, 0, 0))
2c0b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
2c0c0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2c0d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c0e0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2c0f0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2c100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c110 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2c120 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
2c130 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
2c140 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
2c150 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2c160 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
2c170 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2c180 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
2c190 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
2c1a0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
2c1b0 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
2c1c0 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
2c1d0 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
2c1e0 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
2c1f0 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
2c200 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
2c210 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
2c220 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2c230 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2c240 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
2c250 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
2c260 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
2c270 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
2c280 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
2c290 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
2c2a0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
2c2b0 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
2c2c0 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
2c2d0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
2c2e0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
2c2f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2c300 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c310 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
2c320 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2c330 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
2c340 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
2c350 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
2c360 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2c370 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
2c380 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
2c390 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
2c3a0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
2c3b0 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
2c3c0 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
2c3d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c3e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2c3f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62  t->mutex) );.  b
2c400 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2c410 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
2c420 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
2c430 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
2c440 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c450 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
2c460 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
2c470 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
2c480 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
2c490 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
2c4a0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
2c4b0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
2c4c0 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
2c4d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c4e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2c4f0 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
2c500 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
2c510 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
2c520 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
2c530 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
2c540 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
2c550 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
2c560 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
2c570 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
2c580 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2c590 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
2c5a0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
2c5b0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
2c5c0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
2c5d0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
2c5e0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
2c5f0 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
2c600 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
2c610 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
2c620 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
2c630 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2c640 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
2c650 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
2c660 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2c670 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
2c680 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
2c690 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
2c6a0 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
2c6b0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
2c6c0 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
2c6d0 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
2c6e0 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
2c6f0 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
2c700 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
2c710 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2c720 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
2c730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2c740 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2c750 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
2c760 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
2c770 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
2c780 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
2c790 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
2c7a0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2c7b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2c7c0 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
2c7d0 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
2c7e0 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2c7f0 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
2c800 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
2c810 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2c820 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
2c830 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
2c840 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2c850 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
2c860 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
2c870 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
2c880 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
2c890 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
2c8a0 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
2c8b0 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
2c8c0 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
2c8d0 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
2c8e0 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
2c8f0 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
2c900 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
2c910 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
2c920 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
2c930 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
2c940 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2c950 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
2c960 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2c970 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
2c980 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
2c990 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
2c9a0 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
2c9b0 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
2c9c0 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
2c9d0 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
2c9e0 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
2c9f0 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
2ca00 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
2ca10 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
2ca20 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
2ca30 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
2ca40 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
2ca50 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
2ca60 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
2ca70 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
2ca80 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
2ca90 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
2caa0 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
2cab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2cac0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2cad0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
2cae0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
2caf0 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
2cb00 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
2cb10 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2cb20 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
2cb30 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2cb40 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
2cb50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2cb60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2cb70 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
2cb80 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
2cb90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2cba0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
2cbb0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
2cbc0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
2cbd0 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
2cbe0 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
2cbf0 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
2cc00 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
2cc10 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
2cc20 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
2cc30 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
2cc40 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
2cc50 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
2cc60 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
2cc70 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2cc80 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
2cc90 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
2cca0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
2ccb0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
2ccc0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
2ccd0 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
2cce0 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
2ccf0 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
2cd00 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
2cd10 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
2cd20 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
2cd30 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
2cd40 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
2cd50 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
2cd60 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
2cd70 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
2cd80 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
2cd90 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
2cda0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2cdb0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
2cdc0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
2cdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2cde0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
2cdf0 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
2ce00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2ce10 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2ce20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
2ce30 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
2ce40 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2ce50 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
2ce60 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
2ce70 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2ce80 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
2ce90 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
2cea0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cec0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
2ced0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
2cee0 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
2cef0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cf10 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
2cf20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2cf30 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
2cf40 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
2cf50 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
2cf60 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
2cf70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
2cf80 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
2cf90 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
2cfa0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2cfb0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
2cfc0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
2cfd0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
2cfe0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2cff0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
2d000 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
2d010 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
2d020 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
2d030 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2d040 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2d050 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
2d060 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
2d070 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
2d080 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
2d090 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
2d0a0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
2d0b0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
2d0c0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
2d0d0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
2d0e0 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
2d0f0 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
2d100 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
2d110 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2d120 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2d130 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2d140 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2d150 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d160 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2d170 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
2d180 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
2d190 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2d1a0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
2d1b0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
2d1c0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
2d1d0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2d1e0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
2d1f0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
2d200 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
2d210 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
2d220 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
2d230 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2d240 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2d250 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
2d260 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
2d270 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2d280 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
2d290 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2d2a0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
2d2b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2d2c0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
2d2d0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2d2e0 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
2d2f0 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
2d300 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2d310 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
2d320 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
2d330 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
2d340 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
2d350 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2d360 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
2d370 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
2d380 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
2d390 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
2d3a0 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
2d3b0 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
2d3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2d3d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2d3e0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
2d3f0 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
2d400 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
2d410 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
2d420 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
2d430 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
2d440 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
2d450 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
2d460 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
2d470 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
2d480 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
2d490 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
2d4a0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
2d4b0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
2d4c0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
2d4d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2d4e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2d4f0 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
2d500 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
2d510 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2d520 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
2d530 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2d540 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2d550 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2d560 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
2d570 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
2d580 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
2d590 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
2d5a0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
2d5b0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
2d5c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2d5d0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
2d5e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2d5f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2d600 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2d610 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
2d620 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
2d630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d640 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2d650 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2d660 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2d670 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
2d680 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
2d690 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
2d6a0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2d6b0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
2d6c0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
2d6d0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
2d6e0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
2d6f0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
2d700 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
2d710 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
2d720 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
2d730 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
2d740 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
2d750 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
2d760 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2d770 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
2d780 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
2d790 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
2d7a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
2d7b0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
2d7c0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
2d7d0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
2d7e0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
2d7f0 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
2d800 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
2d810 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
2d820 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
2d830 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
2d840 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
2d850 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d860 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2d870 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
2d880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d890 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
2d8a0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
2d8b0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
2d8c0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
2d8d0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2d8e0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
2d8f0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
2d900 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
2d910 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2d920 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
2d930 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
2d940 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2d950 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2d960 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d970 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2d980 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d990 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2d9a0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2d9b0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2d9c0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
2d9d0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2d9e0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
2d9f0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2da00 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2da10 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2da20 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
2da30 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
2da40 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
2da50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2da60 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
2da70 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
2da80 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
2da90 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
2daa0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
2dab0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
2dac0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2dad0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2dae0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2daf0 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
2db00 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
2db10 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2db20 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2db30 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2db40 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2db50 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2db60 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
2db70 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
2db80 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
2db90 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2dba0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
2dbb0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
2dbc0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
2dbd0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
2dbe0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2dbf0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
2dc00 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
2dc10 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
2dc20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
2dc30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2dc40 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
2dc50 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
2dc60 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
2dc70 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
2dc80 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
2dc90 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2dca0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
2dcb0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
2dcc0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2dcd0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2dce0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2dcf0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2dd00 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2dd10 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2dd20 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2dd30 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2dd40 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2dd50 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2dd60 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
2dd70 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2dd80 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2dd90 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2dda0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
2ddb0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2ddc0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
2ddd0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
2dde0 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
2ddf0 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
2de00 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2de10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2de20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2de30 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2de40 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2de50 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
2de60 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
2de70 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
2de80 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
2de90 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
2dea0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
2deb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2dec0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
2ded0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
2dee0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
2def0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
2df00 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
2df10 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
2df20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
2df30 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
2df40 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
2df50 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2df60 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
2df70 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
2df80 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2df90 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
2dfa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2dfb0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2dfc0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
2dfd0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
2dfe0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
2dff0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
2e000 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
2e010 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
2e020 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
2e030 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
2e040 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2e050 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
2e060 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
2e070 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2e080 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
2e090 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2e0a0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
2e0b0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
2e0c0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
2e0d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2e0e0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
2e0f0 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
2e100 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2e110 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
2e120 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
2e130 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
2e140 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
2e150 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
2e160 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
2e170 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2e180 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
2e190 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
2e1a0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
2e1b0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
2e1c0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
2e1d0 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e  ta[] */.  u8 *en
2e1e0 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64  dPtr;     /* End
2e1f0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
2e200 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2e210 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2e220 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2e230 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2e240 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2e250 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2e260 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2e270 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2e280 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2e290 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2e2a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2e2b0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2e2c0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2e2d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2e2e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2e2f0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2e300 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2e310 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e320 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2e330 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2e340 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2e350 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
2e360 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
2e370 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
2e380 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
2e390 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2e3a0 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
2e3b0 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
2e3c0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
2e3d0 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
2e3e0 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
2e3f0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
2e400 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
2e410 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2e420 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
2e430 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2e440 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
2e450 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2e460 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
2e470 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
2e480 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
2e490 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
2e4a0 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
2e4b0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2e4c0 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d 20 26    }.  endPtr = &
2e4d0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
2e4e0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  2*pPage->nCell -
2e4f0 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28   2];.  assert( (
2e500 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
2e510 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b 20  T(ptr)&1)==0 ); 
2e520 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61 79   /* ptr is alway
2e530 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 2-byte aligned
2e540 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 74 72   */.  while( ptr
2e550 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 2a  <endPtr ){.    *
2e560 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31  (u16*)ptr = *(u1
2e570 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20 20  6*)&ptr[2];.    
2e580 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  ptr += 2;.  }.  
2e590 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
2e5a0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2e5b0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2e5c0 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2e5d0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2e5e0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2e5f0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2e600 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2e610 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2e620 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2e630 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2e640 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2e650 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2e660 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2e670 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2e680 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2e690 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2e6a0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2e6b0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2e6c0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2e6d0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2e6e0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2e6f0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2e700 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2e710 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
2e720 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
2e730 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
2e740 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
2e750 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
2e760 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
2e770 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
2e780 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
2e790 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
2e7a0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
2e7b0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
2e7c0 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
2e7d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2e7e0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
2e7f0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
2e800 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2e810 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
2e820 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
2e830 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
2e840 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
2e850 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
2e860 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
2e870 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
2e880 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
2e890 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
2e8a0 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
2e8b0 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
2e8c0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2e8d0 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
2e8e0 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
2e8f0 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
2e900 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
2e910 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2e920 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
2e930 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
2e940 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
2e950 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
2e960 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
2e970 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
2e980 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
2e990 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
2e9a0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2e9b0 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
2e9c0 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
2e9d0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2e9e0 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
2e9f0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
2ea00 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
2ea10 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
2ea20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
2ea30 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
2ea40 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
2ea50 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
2ea60 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
2ea70 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
2ea80 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
2ea90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2eaa0 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
2eab0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
2eac0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
2ead0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
2eae0 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
2eaf0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
2eb00 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2eb10 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
2eb20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2eb30 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
2eb40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
2eb50 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
2eb60 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2eb70 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2eb80 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
2eb90 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
2eba0 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
2ebb0 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
2ebc0 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  erted */.  int c
2ebd0 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
2ebe0 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
2ebf0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2ec00 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2ec10 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
2ec20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
2ec30 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
2ec40 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
2ec50 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
2ec60 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
2ec70 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
2ec80 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2ec90 65 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f 2a  endPtr;       /*
2eca0 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
2ecb0 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70   */..  int nSkip
2ecc0 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a   = (iChild ? 4 :
2ecd0 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43   0);..  if( *pRC
2ece0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
2ecf0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
2ed00 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
2ed10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
2ed20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2ed30 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
2ed40 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
2ed50 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
2ed60 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
2ed70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ed80 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
2ed90 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
2eda0 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
2edb0 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65   ArraySize(pPage
2edc0 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79  ->apOvfl)==Array
2edd0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76  Size(pPage->aiOv
2ede0 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
2edf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2ee00 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2ee10 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
2ee20 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e  he cell should n
2ee30 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64  ormally be sized
2ee40 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77   correctly.  How
2ee50 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e  ever, when movin
2ee60 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d  g a.  ** malform
2ee70 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c  ed cell from a l
2ee80 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69  eaf page to an i
2ee90 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66  nterior page, if
2eea0 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20   the cell size. 
2eeb0 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65   ** wanted to be
2eec0 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74   less than 4 but
2eed0 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20   got rounded up 
2eee0 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66  to 4 on the leaf
2eef0 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a  , then size.  **
2ef00 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
2ef10 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65  han 8 (leaf-size
2ef20 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74   + pointer) on t
2ef30 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
2ef40 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
2ef50 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65  e term after the
2ef60 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   || in the follo
2ef70 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a  wing assert(). *
2ef80 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  /.  assert( sz==
2ef90 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2efa0 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
2efb0 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
2efc0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
2efd0 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
2efe0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
2eff0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
2f000 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
2f010 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
2f020 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
2f030 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
2f040 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
2f050 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
2f060 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2f070 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
2f080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
2f090 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2f0a0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
2f0b0 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
2f0c0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69  Page->apOvfl)/si
2f0d0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
2f0e0 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
2f0f0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20  Page->apOvfl[j] 
2f100 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61  = pCell;.    pPa
2f110 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->aiOvfl[j] = 
2f120 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b  (u16)i;.  }else{
2f130 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
2f140 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f150 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2f160 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f180 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
2f190 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2f1a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2f1b0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2f1c0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2f1d0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
2f1e0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2f1f0 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
2f200 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2f210 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
2f220 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
2f230 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  e->nCell;.    in
2f240 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  s = cellOffset +
2f250 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61   2*i;.    rc = a
2f260 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
2f270 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20  ge, sz, &idx);. 
2f280 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52     if( rc ){ *pR
2f290 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20  C = rc; return; 
2f2a0 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c  }.    /* The all
2f2b0 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75  ocateSpace() rou
2f2c0 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20  tine guarantees 
2f2d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2f2e0 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  o properties.   
2f2f0 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
2f300 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20  s success */.   
2f310 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
2f320 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  end+2 );.    ass
2f330 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28  ert( idx+sz <= (
2f340 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
2f350 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2f360 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
2f370 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
2f380 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20  ee -= (u16)(2 + 
2f390 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  sz);.    memcpy(
2f3a0 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d  &data[idx+nSkip]
2f3b0 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2f3c0 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66  z-nSkip);.    if
2f3d0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
2f3e0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
2f3f0 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
2f400 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20 3d 20      }.    ptr = 
2f410 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20 20  &data[end];.    
2f420 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b 69  endPtr = &data[i
2f430 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ns];.    assert(
2f440 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
2f450 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29  INT(ptr)&1)==0 )
2f460 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77  ;  /* ptr is alw
2f470 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e  ays 2-byte align
2f480 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ed */.    while(
2f490 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a 20   ptr>endPtr ){. 
2f4a0 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20       *(u16*)ptr 
2f4b0 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d 32  = *(u16*)&ptr[-2
2f4c0 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d 3d 20  ];.      ptr -= 
2f4d0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  2;.    }.    put
2f4e0 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
2f4f0 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
2f500 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
2f510 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
2f520 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
2f530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f540 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2f550 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
2f560 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2f570 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
2f580 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
2f590 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
2f5a0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2f5b0 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
2f5c0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
2f5d0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2f5e0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
2f5f0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
2f600 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
2f610 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
2f620 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
2f630 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
2f640 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
2f650 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
2f660 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
2f670 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
2f680 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
2f690 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
2f6a0 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
2f6b0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2f6c0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
2f6d0 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
2f6e0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
2f6f0 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
2f700 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
2f710 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
2f720 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2f730 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
2f740 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2f750 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
2f760 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
2f770 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
2f780 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
2f790 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2f7a0 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
2f7b0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2f7c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2f7d0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
2f7e0 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
2f7f0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2f800 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
2f810 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
2f820 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2f830 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
2f840 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
2f850 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2f860 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2f870 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
2f880 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
2f890 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
2f8a0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2f8b0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
2f8c0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
2f8d0 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
2f8e0 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
2f8f0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
2f900 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
2f910 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
2f920 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
2f930 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2f940 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
2f950 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f960 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2f970 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2f980 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
2f990 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f   nCell<=(int)MX_
2f9a0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2f9c0 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
2f9d0 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29  ge->pBt)<=10921)
2f9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2f9f0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2fa00 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2fa10 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
2fa20 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
2fa30 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
2fa40 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
2fa50 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
2fa60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2fa70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
2fa80 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
2fa90 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
2faa0 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
2fab0 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
2fac0 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b  ellIdx[nCell*2];
2fad0 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55  .  cellbody = nU
2fae0 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e  sable;.  for(i=n
2faf0 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Cell-1; i>=0; i-
2fb00 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d  -){.    u16 sz =
2fb10 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70   aSize[i];.    p
2fb20 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
2fb30 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a    cellbody -= sz
2fb40 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
2fb50 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64  Cellptr, cellbod
2fb60 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
2fb70 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
2fb80 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
2fb90 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
2fba0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
2fbb0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
2fbc0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
2fbd0 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2fbe0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
2fbf0 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
2fc00 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2fc10 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
2fc20 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
2fc30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
2fc40 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
2fc50 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
2fc60 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
2fc70 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
2fc80 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2fc90 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
2fca0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
2fcb0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2fcc0 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
2fcd0 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
2fce0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
2fcf0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2fd00 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
2fd10 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2fd20 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
2fd30 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
2fd40 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
2fd50 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
2fd60 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2fd70 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
2fd80 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
2fd90 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
2fda0 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
2fdb0 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
2fdc0 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
2fdd0 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
2fde0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
2fdf0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
2fe00 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
2fe10 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
2fe20 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
2fe30 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
2fe40 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
2fe50 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
2fe60 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
2fe70 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
2fe80 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
2fe90 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
2fea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2feb0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2fec0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2fed0 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
2fee0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
2fef0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
2ff00 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
2ff10 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
2ff20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ff30 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2ff40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
2ff50 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
2ff60 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
2ff70 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
2ff80 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
2ff90 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
2ffa0 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
2ffb0 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
2ffc0 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
2ffd0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
2ffe0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
2fff0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
30000 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
30010 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
30020 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
30030 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
30040 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
30050 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
30060 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
30070 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
30080 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
30090 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
300a0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
300b0 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
300c0 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
300d0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
300e0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
300f0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
30100 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
30110 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
30120 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
30130 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
30140 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
30150 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
30160 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
30170 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
30180 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
30190 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
301a0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
301b0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
301c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
301d0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
301e0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
301f0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
30200 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
30210 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
30220 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
30230 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
30240 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
30250 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
30260 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
30270 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
30280 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
30290 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
302a0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
302b0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
302c0 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
302d0 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
302e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
302f0 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
30300 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
30310 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
30320 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
30330 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
30340 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
30350 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
30360 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
30370 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
30380 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
30390 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
303a0 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
303b0 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
303c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
303d0 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
303e0 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
303f0 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
30400 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30420 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
30430 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
30440 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30460 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30470 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
30480 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
30490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304a0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
304b0 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
304c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
304d0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
304e0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
304f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30500 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30510 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
30520 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
30530 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30540 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
30550 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
30560 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
30570 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
30580 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
30590 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
305a0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  >nCell==0 ) retu
305b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
305c0 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
305d0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
305e0 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
305f0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
30600 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
30610 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
30620 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
30630 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
30640 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
30650 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
30660 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
30670 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
30680 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
30690 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
306a0 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
306b0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
306c0 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
306d0 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
306e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
306f0 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
30700 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
30710 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
30720 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a  age->apOvfl[0];.
30730 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
30740 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
30750 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
30760 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
30770 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30780 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30790 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
307a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
307b0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
307c0 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
307d0 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
307e0 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
307f0 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
30800 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
30810 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
30820 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
30830 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
30840 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
30850 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
30860 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
30870 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
30880 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
30890 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
308a0 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
308b0 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
308c0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
308d0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
308e0 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
308f0 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
30900 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
30910 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
30920 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
30930 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
30940 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
30950 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
30960 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
30970 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
30980 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
30990 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
309a0 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
309b0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
309c0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
309d0 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
309e0 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
309f0 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
30a00 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
30a10 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
30a20 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
30a30 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
30a40 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
30a50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
30a60 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
30a70 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
30a80 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
30a90 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
30aa0 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
30ab0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
30ac0 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
30ad0 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
30ae0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
30af0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20   pCell, &rc);.  
30b00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
30b10 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64     /* Create a d
30b20 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69  ivider cell to i
30b30 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65  nsert into pPare
30b40 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20  nt. The divider 
30b50 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  cell.    ** cons
30b60 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65  ists of a 4-byte
30b70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68   page number (th
30b80 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
30b90 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20   pPage) and.    
30ba0 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  ** a variable le
30bb0 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28  ngth key value (
30bc0 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68  which must be th
30bd0 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
30be0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  the.    ** large
30bf0 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29  st key on pPage)
30c00 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
30c10 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  To find the larg
30c20 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e  est key value on
30c30 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69   pPage, first fi
30c40 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  nd the right-mos
30c50 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  t .    ** cell o
30c60 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72  n pPage. The fir
30c70 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66  st two fields of
30c80 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74   this cell are t
30c90 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  he .    ** recor
30ca0 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69  d-length (a vari
30cb0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
30cc0 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62  ger at most 32-b
30cd0 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20  its in size).   
30ce0 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20   ** and the key 
30cf0 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c  value (a variabl
30d00 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
30d10 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76  , may have any v
30d20 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68  alue)..    ** Th
30d30 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77  e first of the w
30d40 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20  hile(...) loops 
30d50 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72  below skips over
30d60 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67   the record-leng
30d70 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e  th.    ** field.
30d80 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c   The second whil
30d90 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69  e(...) loop copi
30da0 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  es the key value
30db0 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
30dc0 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69   cell on pPage i
30dd0 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62  nto the pSpace b
30de0 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  uffer..    */.  
30df0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
30e00 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
30e10 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70  >nCell-1);.    p
30e20 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
30e30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28  ;.    while( (*(
30e40 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26  pCell++)&0x80) &
30e50 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
30e60 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
30e70 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
30e80 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d  e( ((*(pOut++) =
30e90 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38   *(pCell++))&0x8
30ea0 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
30eb0 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  p );..    /* Ins
30ec0 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  ert the new divi
30ed0 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50  der cell into pP
30ee0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  arent. */.    in
30ef0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
30f00 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  , pParent->nCell
30f10 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28  , pSpace, (int)(
30f20 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20  pOut-pSpace),.  
30f30 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
30f40 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63  pPage->pgno, &rc
30f50 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
30f60 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
30f70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e  ointer of pParen
30f80 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
30f90 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
30fa0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
30fb0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
30fc0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
30fd0 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
30fe0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
30ff0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
31000 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
31010 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
31020 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
31030 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
31040 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31050 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
31060 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54  /..#if 0./*.** T
31070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
31080 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
31090 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
310a0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51   operation of SQ
310b0 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73  Lite..** it is s
310c0 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74  ometimes activat
310d0 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77  ed temporarily w
310e0 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63  hile debugging c
310f0 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  ode responsible 
31100 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20  .** for setting 
31110 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
31120 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ies..*/.static i
31130 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  nt ptrmapCheckPa
31140 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70  ges(MemPage **ap
31150 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29  Page, int nPage)
31160 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
31170 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65  for(i=0; i<nPage
31180 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f  ; i++){.    Pgno
31190 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20   n;.    u8 e;.  
311a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
311b0 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20   = apPage[i];.  
311c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
311d0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
311e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
311f0 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20  >isInit );..    
31200 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65  for(j=0; j<pPage
31210 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20  ->nCell; j++){. 
31220 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
31230 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b  fo;.      u8 *z;
31240 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d  .     .      z =
31250 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
31260 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65   j);.      btree
31270 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
31280 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20  ge, z, &info);. 
31290 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
312a0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
312b0 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
312c0 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e  et4byte(&z[info.
312d0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
312e0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
312f0 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e  Bt, ovfl, &e, &n
31300 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31310 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
31320 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f  o && e==PTRMAP_O
31330 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20  VERFLOW1 );.    
31340 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
31350 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31360 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
31370 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a   = get4byte(z);.
31380 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
31390 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
313a0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
313b0 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
313c0 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
313d0 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
313e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
313f0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31400 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
31410 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
31420 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
31430 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
31440 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65  ;.      ptrmapGe
31450 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
31460 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  , &n);.      ass
31470 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
31480 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
31490 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a  _BTREE );.    }.
314a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
314b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
314c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
314d0 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68   used to copy th
314e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
314f0 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74  e b-tree node st
31500 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65  ored .** on page
31510 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
31520 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f  To. If page pFro
31530 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66  m was not a leaf
31540 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74   page, then.** t
31550 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
31560 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
31570 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75  child page are u
31580 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
31590 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67  he.** parent pag
315a0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
315b0 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70  pointer map is p
315c0 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f  age pTo. If pFro
315d0 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61  m contained.** a
315e0 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76  ny cells with ov
315f0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
31600 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ters, then the c
31610 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69  orresponding poi
31620 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
31630 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64  ies are also upd
31640 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
31650 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
31660 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20  page pTo..**.** 
31670 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72  If pFrom is curr
31680 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61  ently carrying a
31690 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
316a0 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68  s (entries in th
316b0 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f  e.** MemPage.apO
316c0 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
316d0 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
316e0 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
316f0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
31700 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
31710 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
31720 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ng btreeInitPage
31730 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65  ()..**.** The pe
31740 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69  rformance of thi
31750 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
31760 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69  t critical. It i
31770 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a  s only used by .
31780 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73  ** the balance_s
31790 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62  hallower() and b
317a0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
317b0 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74  procedures, neit
317c0 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20  her of.** which 
317d0 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e  are called often
317e0 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69   under normal ci
317f0 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a  rcumstances..*/.
31800 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79  static void copy
31810 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50  NodeContent(MemP
31820 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50  age *pFrom, MemP
31830 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70  age *pTo, int *p
31840 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
31850 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
31860 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20 63      BtShared * c
31870 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d  onst pBt = pFrom
31880 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20  ->pBt;.    u8 * 
31890 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46  const aFrom = pF
318a0 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  rom->aData;.    
318b0 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d  u8 * const aTo =
318c0 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20   pTo->aData;.   
318d0 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d   int const iFrom
318e0 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72  Hdr = pFrom->hdr
318f0 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20  Offset;.    int 
31900 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28  const iToHdr = (
31910 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f  (pTo->pgno==1) ?
31920 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69   100 : 0);.    i
31930 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69  nt rc;.    int i
31940 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20  Data;.  .  .    
31950 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69  assert( pFrom->i
31960 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73  sInit );.    ass
31970 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65  ert( pFrom->nFre
31980 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20  e>=iToHdr );.   
31990 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
319a0 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
319b0 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42  r+5]) <= (int)pB
319c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
319d0 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
319e0 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
319f0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
31a00 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
31a10 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74  pTo. */.    iDat
31a20 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
31a30 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
31a40 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
31a50 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
31a60 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
31a70 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
31a80 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  .    memcpy(&aTo
31a90 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
31aa0 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
31ab0 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
31ac0 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
31ad0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69  .  .    /* Reini
31ae0 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
31af0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
31b00 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
31b10 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
31b20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20     ** match the 
31b30 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e  new data. The in
31b40 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
31b50 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79  pTo can actually
31b60 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20   fail under.    
31b70 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72  ** fairly obscur
31b80 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c  e circumstances,
31b90 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
31ba0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69  is a copy of ini
31bb0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
31bc0 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20   page pFrom..   
31bd0 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49   */.    pTo->isI
31be0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  nit = 0;.    rc 
31bf0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
31c00 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pTo);.    if( rc
31c10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31c20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
31c30 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
31c40 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
31c50 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
31c60 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
31c70 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
31c80 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
31c90 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
31ca0 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
31cb0 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
31cc0 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
31cd0 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
31ce0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
31cf0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
31d00 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
31d10 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
31d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
31d30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
31d40 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
31d50 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
31d60 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
31d70 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
31d80 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
31d90 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
31da0 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
31db0 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
31dc0 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
31dd0 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
31de0 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
31df0 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
31e00 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
31e10 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
31e20 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
31e30 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
31e40 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
31e50 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
31e60 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
31e70 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
31e80 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
31e90 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
31ea0 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
31eb0 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
31ec0 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
31ed0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
31ee0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
31ef0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
31f00 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
31f10 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
31f20 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
31f30 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
31f40 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
31f50 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
31f60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
31f70 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
31f80 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
31f90 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
31fa0 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
31fb0 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
31fc0 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
31fd0 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
31fe0 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
31ff0 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
32000 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
32010 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
32020 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
32030 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
32040 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
32050 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
32060 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
32070 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
32080 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
32090 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
320a0 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
320b0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
320c0 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
320d0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
320e0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
320f0 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
32100 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
32110 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
32120 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
32130 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
32140 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
32150 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
32160 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
32170 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
32180 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
32190 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
321a0 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
321b0 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
321c0 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
321d0 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
321e0 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
321f0 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
32200 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
32210 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
32220 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
32230 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
32240 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
32250 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
32260 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
32270 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
32280 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
32290 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
322a0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
322b0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
322c0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
322d0 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
322e0 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
322f0 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
32300 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
32310 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
32320 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
32330 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
32340 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
32350 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
32360 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
32370 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
32380 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
32390 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
323a0 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
323b0 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
323c0 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
323d0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
323e0 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
323f0 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
32400 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
32410 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
32420 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
32430 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
32440 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
32450 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
32460 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
32470 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
32480 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
32490 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
324a0 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
324b0 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
324c0 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
324d0 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
324e0 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
324f0 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
32500 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
32510 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
32520 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
32530 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
32540 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
32550 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
32560 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
32570 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
32580 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
32590 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
325a0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
325b0 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45  _VER) && _MSC_VE
325c0 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66  R >= 1700 && def
325d0 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72  ined(_M_ARM).#pr
325e0 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22  agma optimize(""
325f0 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74  , off).#endif.st
32600 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
32610 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
32620 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
32630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32640 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
32650 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
32660 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
32670 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
32680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
32690 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
326a0 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
326b0 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
326c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
326d0 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
326e0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
326f0 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
32700 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20  .  int isRoot,  
32710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32720 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
32730 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
32740 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42  page */.  int bB
32750 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ulk             
32760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
32770 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e if this call i
32780 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b  s part of a bulk
32790 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74   load */.){.  Bt
327a0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
327b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
327c0 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
327d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
327e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
327f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32800 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
32810 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
32820 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
32830 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
32840 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
32850 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
32860 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  */.  int nNew = 
32870 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
32880 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
32890 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
328a0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
328b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
328d0 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
328e0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
328f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32900 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
32910 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  rs */.  int nxDi
32920 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
32930 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
32940 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
32950 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
32960 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32970 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
32980 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
32990 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66  de */.  u16 leaf
329a0 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
329b0 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
329c0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
329d0 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
329e0 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
329f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
32a00 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
32a10 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
32a20 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
32a30 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
32a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
32a50 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
32a60 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
32a70 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
32a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32a90 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
32aa0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
32ab0 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
32ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32ad0 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
32ae0 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
32af0 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
32b00 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20   iSpace1 = 0;   
32b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
32b20 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
32b30 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20  f aSpace1[] */. 
32b40 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20   int iOvflSpace 
32b50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
32b60 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
32b70 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65  te of aOvflSpace
32b80 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
32b90 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
32ba0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
32bb0 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
32bc0 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
32bd0 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
32be0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
32bf0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
32c00 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
32c10 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
32c20 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
32c30 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
32c40 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
32c50 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
32c60 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
32c70 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
32c80 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
32c90 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
32ca0 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74   */.  u8 *pRight
32cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32cc0 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69     /* Location i
32cd0 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68  n parent of righ
32ce0 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65  t-sibling pointe
32cf0 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  r */.  u8 *apDiv
32d00 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20  [NB-1];         
32d10 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
32d20 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
32d30 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
32d40 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
32d50 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
32d60 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
32d70 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
32d80 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
32d90 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
32da0 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
32db0 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
32dc0 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
32dd0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
32de0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
32df0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
32e00 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
32e10 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
32e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e30 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
32e40 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
32e50 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  l[] */.  u8 *aSp
32e60 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
32e70 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
32e80 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
32e90 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20  iders cells */. 
32ea0 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32ec0 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f   Temp var to sto
32ed0 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  re a page number
32ee0 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20   in */..  pBt = 
32ef0 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
32f00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
32f10 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
32f20 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
32f30 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
32f40 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
32f50 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
32f60 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28  ..#if 0.  TRACE(
32f70 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
32f80 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
32f90 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
32fa0 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
32fb0 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  gno));.#endif.. 
32fc0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
32fd0 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61  t pParent may ha
32fe0 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  ve at most one o
32ff0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e  verflow cell. An
33000 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f  d if.  ** this o
33010 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
33020 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74  present, it must
33030 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74   be the cell wit
33040 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50  h .  ** index iP
33050 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73  arentIdx. This s
33060 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62  cenario comes ab
33070 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  out when this fu
33080 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63  nction.  ** is c
33090 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
330a0 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  y) from sqlite3B
330b0 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20  treeDelete()..  
330c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
330d0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
330e0 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e  =0 || pParent->n
330f0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
33100 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
33110 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
33120 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66  | pParent->aiOvf
33130 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78  l[0]==iParentIdx
33140 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
33150 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
33160 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33170 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
33180 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
33190 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
331a0 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
331b0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
331c0 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
331d0 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
331e0 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
331f0 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
33200 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
33210 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
33220 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
33230 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
33240 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
33250 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
33260 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
33270 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
33280 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
33290 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
332a0 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
332b0 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
332c0 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
332d0 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
332e0 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
332f0 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
33300 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
33310 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
33320 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
33330 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
33340 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
33350 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
33360 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
33370 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
33380 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
33390 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
333a0 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65  , since if any e
333b0 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c  xisted they will
333c0 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61  .  ** have alrea
333d0 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  dy been removed.
333e0 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72  .  */.  i = pPar
333f0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b  ent->nOverflow +
33400 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
33410 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20  .  if( i<2 ){.  
33420 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
33430 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33440 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42  ( bBulk==0 || bB
33450 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  ulk==1 );.    if
33460 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
33470 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
33480 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
33490 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
334a0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
334b0 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
334c0 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20  = i-2+bBulk;.   
334d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
334e0 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29  sert( bBulk==0 )
334f0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  ;.      nxDiv = 
33500 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
33510 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42    }.    i = 2-bB
33520 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20  ulk;.  }.  nOld 
33530 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b  = i+1;.  if( (i+
33540 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
33550 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
33560 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
33570 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
33580 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
33590 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
335a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
335b0 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
335c0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
335d0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
335e0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
335f0 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
33600 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
33610 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
33620 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
33630 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  pgno, &apOld[i],
33640 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
33650 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
33660 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
33670 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
33680 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61  );.      goto ba
33690 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
336a0 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c     }.    nMaxCel
336b0 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
336c0 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
336d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
336e0 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20   if( (i--)==0 ) 
336f0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20  break;..    if( 
33700 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  i+nxDiv==pParent
33710 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70  ->aiOvfl[0] && p
33720 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
33730 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
33740 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
33750 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pOvfl[0];.      
33760 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
33770 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
33780 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
33790 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
337a0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
337b0 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72    pParent->nOver
337c0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65  flow = 0;.    }e
337d0 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76  lse{.      apDiv
337e0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
337f0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
33800 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33810 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ow);.      pgno 
33820 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
33830 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
33840 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
33850 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
33860 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  v[i]);..      /*
33870 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66   Drop the cell f
33880 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
33890 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74  age. apDiv[i] st
338a0 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20  ill points to.  
338b0 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20      ** the cell 
338c0 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e  within the paren
338d0 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  t, even though i
338e0 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70  t has been dropp
338f0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ed..      ** Thi
33900 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
33910 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c  e dropping a cel
33920 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  l only overwrite
33930 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  s the first.    
33940 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
33950 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20  of it, and this 
33960 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
33970 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74  t need the first
33980 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
33990 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  ytes of the divi
339a0 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65  der cell. So the
339b0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65   pointer is safe
339c0 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a   to use.      **
339d0 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20   later on.  .   
339e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
339f0 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65  ut not if we are
33a00 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74   in secure-delet
33a10 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72  e mode. In secur
33a20 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20  e-delete mode,. 
33a30 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
33a40 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
33a50 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
33a60 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
33a70 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
33a80 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
33a90 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
33aa0 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
33ab0 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
33ac0 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
33ad0 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
33ae0 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
33af0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
33b00 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
33b10 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
33b20 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
33b30 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
33b40 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
33b50 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LETE ){.        
33b60 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  int iOff;..     
33b70 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45     iOff = SQLITE
33b80 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69  _PTR_TO_INT(apDi
33b90 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50  v[i]) - SQLITE_P
33ba0 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e  TR_TO_INT(pParen
33bb0 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  t->aData);.     
33bc0 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e     if( (iOff+szN
33bd0 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d  ew[i])>(int)pBt-
33be0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
33bf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33c00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33c10 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  T;.          mem
33c20 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
33c30 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
33c40 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ge*));.         
33c50 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
33c60 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
33c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
33c80 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61  memcpy(&aOvflSpa
33c90 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b  ce[iOff], apDiv[
33ca0 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20  i], szNew[i]);. 
33cb0 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b 69           apDiv[i
33cc0 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b  ] = &aOvflSpace[
33cd0 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74  apDiv[i]-pParent
33ce0 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20  ->aData];.      
33cf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33d00 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
33d10 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
33d20 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
33d30 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a  szNew[i], &rc);.
33d40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
33d50 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
33d60 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
33d70 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
33d80 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
33d90 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
33da0 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
33db0 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
33dc0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
33dd0 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
33de0 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
33df0 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70   */.  k = pBt->p
33e00 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38  ageSize + ROUND8
33e10 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
33e20 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  );.  szScratch =
33e30 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
33e40 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e60 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
33e70 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
33e80 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
33e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ea0 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
33eb0 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
33ec0 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
33ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ee0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
33ef0 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b  /.     + k*nOld;
33f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70       /* Page cop
33f30 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a  ies (apCopy) */.
33f40 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
33f50 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
33f60 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
33f70 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
33f80 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
33f90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
33fa0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
33fb0 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
33fc0 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
33fd0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53  nMaxCells];.  aS
33fe0 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a  pace1 = (u8*)&sz
33ff0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
34000 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
34010 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
34020 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f  aSpace1) );..  /
34030 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
34040 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
34050 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
34060 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
34070 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
34080 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
34090 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
340a0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
340b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
340c0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
340d0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70  btained from aSp
340e0 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
340f0 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
34100 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
34110 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
34120 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
34130 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
34140 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
34150 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
34160 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
34170 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
34180 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
34190 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
341a0 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
341b0 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
341c0 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
341d0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
341e0 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
341f0 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
34200 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
34210 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
34220 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
34230 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
34240 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
34250 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
34260 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
34270 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
34280 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
34290 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
342a0 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
342b0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
342c0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
342d0 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
342e0 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
342f0 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
34300 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
34310 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
34320 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f  s..  */.  leafCo
34330 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64  rrection = apOld
34340 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  [0]->leaf*4;.  l
34350 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b  eafData = apOld[
34360 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  0]->hasData;.  f
34370 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
34380 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
34390 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
343a0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
343b0 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
343c0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
343d0 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
343e0 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
343f0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
34400 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
34410 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
34420 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
34430 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
34440 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
34450 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
34460 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
34470 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
34480 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
34490 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
344a0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
344b0 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
344c0 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
344d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
344e0 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
344f0 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
34500 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
34510 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
34520 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
34530 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
34540 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
34550 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
34560 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
34570 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
34580 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
34590 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
345a0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  pOld->nOverflow>
345b0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
345c0 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
345d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
345e0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
345f0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
34600 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
34610 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
34620 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Old, j);.       
34630 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
34640 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
34650 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
34660 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
34670 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
34680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
34690 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61  *aData = pOld->a
346a0 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20  Data;.      u16 
346b0 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d  maskPage = pOld-
346c0 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20  >maskPage;.     
346d0 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20   u16 cellOffset 
346e0 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73  = pOld->cellOffs
346f0 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  et;.      for(j=
34700 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
34710 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
34720 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
34730 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
34740 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
34750 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d  dCellv2(aData, m
34760 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66  askPage, cellOff
34770 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  set, j);.       
34780 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
34790 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
347a0 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
347b0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
347c0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
347d0 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28  }       .    if(
347e0 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
347f0 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
34800 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
34810 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
34820 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
34830 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
34840 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
34850 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
34860 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
34870 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
34880 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
34890 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
348a0 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
348b0 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
348c0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
348d0 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74  ace1 <= (int)pBt
348e0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
348f0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
34900 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
34910 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
34920 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
34930 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
34940 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
34950 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
34960 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
34970 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
34980 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
34990 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
349a0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
349b0 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
349c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
349d0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
349e0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
349f0 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
34a00 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
34a10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
34a20 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
34a30 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
34a40 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
34a50 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
34a60 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
34a70 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
34a80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
34a90 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
34aa0 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
34ab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
34ad0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
34ae0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
34af0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
34b00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
34b10 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
34b20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
34b30 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
34b40 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
34b50 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
34b60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34b70 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
34b80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
34b90 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
34ba0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
34bb0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
34bc0 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
34bd0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
34be0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
34bf0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
34c00 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
34c10 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
34c20 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
34c30 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
34c40 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
34c50 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
34c60 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
34c70 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
34c80 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
34c90 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
34ca0 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
34cb0 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
34cc0 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
34cd0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
34ce0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
34cf0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
34d00 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
34d10 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
34d20 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
34d30 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
34d40 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
34d50 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
34d60 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
34d70 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
34d80 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
34d90 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
34da0 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
34db0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
34dc0 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
34dd0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
34de0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
34df0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
34e00 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
34e10 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
34e20 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
34e30 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
34e40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
34e50 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
34e60 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
34e70 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
34e80 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
34e90 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
34ea0 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
34eb0 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
34ec0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
34ed0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
34ee0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
34ef0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
34f00 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
34f10 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
34f20 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
34f30 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
34f40 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
34f50 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
34f60 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
34f70 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
34f80 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
34f90 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
34fa0 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
34fb0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
34fc0 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
34fd0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
34fe0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
34ff0 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
35000 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
35010 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
35020 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
35030 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
35040 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
35050 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
35060 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
35070 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
35080 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
35090 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
350a0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
350b0 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
350c0 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
350d0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
350e0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
350f0 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
35100 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
35110 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
35120 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
35130 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
35140 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
35150 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
35160 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
35170 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
35180 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
35190 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
351a0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
351b0 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
351c0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
351d0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
351e0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
351f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
35200 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
35210 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
35220 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
35230 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
35240 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
35250 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
35260 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
35270 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
35280 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
35290 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
352a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
352b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
352c0 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
352d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
352e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
352f0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
35300 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
35310 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
35320 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
35330 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
35340 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
35350 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
35360 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
35370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
35380 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
35390 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
353a0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21  =0 .       || (!
353b0 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74  bBulk && szRight
353c0 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
353d0 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
353e0 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  2)) .    ){.    
353f0 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
35400 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
35410 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
35420 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
35430 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
35440 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
35450 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
35460 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
35470 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
35480 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
35490 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
354a0 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
354b0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
354c0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
354d0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
354e0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
354f0 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
35500 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
35510 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
35520 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
35530 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
35540 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
35550 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
35560 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
35570 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
35580 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73 73  UPDATE:  The ass
35590 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e  ert() below is n
355a0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
355b0 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
355c0 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ase.  ** file is
355d0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63   corrupt.  The c
355e0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62  orruption will b
355f0 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
35600 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20  eported later.  
35610 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ** in this proce
35620 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69 73  dure so there is
35630 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20   no need to act 
35640 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  upon it now..  *
35650 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
35660 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
35670 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
35680 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
35690 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64  Cell==0) );.#end
356a0 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  if..  TRACE(("BA
356b0 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
356c0 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f  d %d  ",.    apO
356d0 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20  ld[0]->pgno, .  
356e0 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c    nOld>=2 ? apOl
356f0 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a  d[1]->pgno : 0,.
35700 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70      nOld>=3 ? ap
35710 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[2]->pgno : 0
35720 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  .  ));..  /*.  *
35730 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
35740 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
35750 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
35760 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
35770 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67  if( apOld[0]->pg
35780 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  no<=1 ){.    rc 
35790 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
357a0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
357b0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
357c0 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
357d0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
357e0 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
357f0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
35800 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
35810 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
35820 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
35830 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
35840 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
35850 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
35860 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35870 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
35880 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
35890 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
358a0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
358b0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
358c0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
358d0 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
358e0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
358f0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
35900 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f   &pgno, (bBulk ?
35910 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a   1 : pgno), 0);.
35920 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
35930 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
35940 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
35950 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
35960 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20    nNew++;..     
35970 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
35980 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
35990 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
359a0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  g page. */.     
359b0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
359c0 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  M ){.        ptr
359d0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
359e0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
359f0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
35a00 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
35a10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35a30 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
35a40 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
35a50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
35a60 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
35a70 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
35a80 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
35a90 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
35aa0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
35ab0 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65  nOld ){.    free
35ac0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26  Page(apOld[i], &
35ad0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
35ae0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
35af0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
35b00 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
35b10 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
35b20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
35b30 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
35b40 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
35b50 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
35b60 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
35b70 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
35b80 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
35b90 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
35ba0 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
35bb0 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
35bc0 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
35bd0 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
35be0 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
35bf0 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
35c00 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
35c10 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
35c20 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
35c30 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
35c40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
35c50 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
35c60 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
35c70 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
35c80 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
35c90 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
35ca0 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
35cb0 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
35cc0 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
35cd0 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
35ce0 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
35cf0 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
35d00 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
35d10 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
35d20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
35d30 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
35d40 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
35d50 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
35d60 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
35d70 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77  int minV = apNew
35d80 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  [i]->pgno;.    i
35d90 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
35da0 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
35db0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
35dc0 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c   apNew[j]->pgno<
35dd0 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
35de0 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
35df0 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
35e00 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e   = apNew[j]->pgn
35e10 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
35e20 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
35e30 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
35e40 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d   *pT;.      pT =
35e50 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
35e60 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
35e70 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
35e80 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
35e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
35ea0 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
35eb0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
35ec0 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
35ed0 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
35ee0 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
35ef0 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
35f00 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
35f10 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
35f20 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
35f30 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
35f40 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
35f50 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
35f60 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
35f70 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
35f80 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
35f90 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
35fa0 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
35fb0 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
35fc0 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
35fd0 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
35fe0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
35ff0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
36000 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
36010 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
36020 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
36030 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
36040 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
36050 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
36060 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
36070 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
36080 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
36090 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
360a0 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
360b0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
360c0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
360d0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
360e0 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
360f0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
36100 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
36110 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
36120 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
36130 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
36140 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
36150 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
36160 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
36170 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
36180 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
36190 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
361a0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
361b0 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
361c0 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
361d0 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
361e0 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
361f0 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d  w==0 );..    j =
36200 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
36210 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
36220 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
36230 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
36240 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
36250 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
36260 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
36270 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
36280 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
36290 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
362a0 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65  nNew-1 || j==nCe
362b0 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c  ll );.    if( j<
362c0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
362d0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
362e0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
362f0 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
36300 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
36310 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
36320 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
36330 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
36340 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
36350 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
36360 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
36370 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
36380 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
36390 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
363a0 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
363b0 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
363c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
363d0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
363e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
363f0 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
36400 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
36410 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
36420 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
36430 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
36440 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
36450 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
36460 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
36470 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
36480 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
36490 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
364a0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
364b0 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
364c0 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
364d0 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
364e0 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
364f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
36500 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
36510 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
36520 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
36530 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
36540 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
36550 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
36560 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
36570 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
36580 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
36590 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
365a0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
365b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
365c0 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
365d0 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
365e0 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
365f0 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
36600 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
36610 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
36620 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
36630 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
36640 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
36650 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
36660 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
36670 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
36680 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
36690 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
366a0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72       ** (see btr
366b0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
366c0 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
366d0 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
366e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
366f0 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
36700 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
36710 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
36720 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
36730 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
36740 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
36750 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
36760 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
36770 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
36780 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
36790 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
367a0 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
367b0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
367c0 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
367d0 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
367e0 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
367f0 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
36800 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
36810 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
36820 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
36830 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
36840 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
36850 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
36860 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
36870 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
36880 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
36890 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
368a0 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
368b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
368c0 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b      iOvflSpace +
368d0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
368e0 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78  rt( sz<=pBt->max
368f0 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20  Local+23 );.    
36900 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53    assert( iOvflS
36910 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70 42 74  pace <= (int)pBt
36920 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
36930 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
36940 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
36950 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
36960 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
36970 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
36980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
36990 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
369a0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
369b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
369c0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
369d0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
369e0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
369f0 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nxDiv++;.    }. 
36a00 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
36a10 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
36a20 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61  t( nOld>0 );.  a
36a30 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
36a40 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67  .  if( (pageFlag
36a50 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30  s & PTF_LEAF)==0
36a60 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69   ){.    u8 *zChi
36a70 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  ld = &apCopy[nOl
36a80 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a  d-1]->aData[8];.
36a90 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
36aa0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
36ab0 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b  [8], zChild, 4);
36ac0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f  .  }..  if( isRo
36ad0 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  ot && pParent->n
36ae0 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
36af0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61  nt->hdrOffset<=a
36b00 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29  pNew[0]->nFree )
36b10 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
36b20 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
36b30 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tree now contain
36b40 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20  s no cells. The 
36b50 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20  only sibling.   
36b60 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20   ** page is the 
36b70 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
36b80 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20  he parent. Copy 
36b90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36ba0 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
36bb0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
36bc0 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e  arent, decreasin
36bd0 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65  g the overall he
36be0 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20  ight of the.    
36bf0 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ** b-tree struct
36c00 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73  ure by one. This
36c10 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73   is described as
36c20 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68   the "balance-sh
36c30 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20  allower".    ** 
36c40 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e  sub-algorithm in
36c50 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74   some documentat
36c60 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ion..    **.    
36c70 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  ** If this is an
36c80 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
36c90 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20  abase, the call 
36ca0 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  to copyNodeConte
36cb0 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74  nt() .    ** set
36cc0 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  s all pointer-ma
36cd0 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
36ce0 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62  ponding to datab
36cf0 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20  ase image pages 
36d00 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63  .    ** for whic
36d10 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  h the pointer is
36d20 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
36d30 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
36d40 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a   copied..    **.
36d50 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
36d60 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76  d assert below v
36d70 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65  erifies that the
36d80 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64   child page is d
36d90 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20  efragmented.    
36da0 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20  ** (it must be, 
36db0 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72  as it was just r
36dc0 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69  econstructed usi
36dd0 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  ng assemblePage(
36de0 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  )). This.    ** 
36df0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20  is important if 
36e00 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
36e10 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61  happens to be pa
36e20 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
36e30 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67  base.    ** imag
36e40 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
36e50 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20  t( nNew==1 );.  
36e60 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b    assert( apNew[
36e70 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20  0]->nFree == .  
36e80 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28        (get2byte(
36e90 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61  &apNew[0]->aData
36ea0 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63  [5])-apNew[0]->c
36eb0 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b  ellOffset-apNew[
36ec0 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20  0]->nCell*2) .  
36ed0 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64    );.    copyNod
36ee0 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30  eContent(apNew[0
36ef0 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29  ], pParent, &rc)
36f00 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  ;.    freePage(a
36f10 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20  pNew[0], &rc);. 
36f20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54   }else if( ISAUT
36f30 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f  OVACUUM ){.    /
36f40 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65  * Fix the pointe
36f50 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
36f60 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20  r all the cells 
36f70 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65  that were shifte
36f80 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a  d around. .    *
36f90 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65  * There are seve
36fa0 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79  ral different ty
36fb0 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  pes of pointer-m
36fc0 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ap entries that 
36fd0 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  need to.    ** b
36fe0 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
36ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f  this routine. So
37000 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65  me of these have
37010 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64   been set alread
37020 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61  y, but.    ** ma
37030 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65  ny have not. The
37040 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
37050 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a  summary:.    **.
37060 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20      **   1) The 
37070 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
37080 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c  ed with new sibl
37090 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77  ing pages that w
370a0 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20  ere not.    **  
370b0 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65      siblings whe
370c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
370d0 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73  was called. Thes
370e0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
370f0 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20     **      been 
37100 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65  set. We don't ne
37110 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75  ed to worry abou
37120 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74  t old siblings t
37130 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20  hat were.    ** 
37140 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68       moved to th
37150 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68  e free-list - th
37160 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64  e freePage() cod
37170 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65  e has taken care
37180 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  .    **      of 
37190 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  those..    **.  
371a0 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f    **   2) The po
371b0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
371c0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
371d0 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  h the first over
371e0 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20  flow.    **     
371f0 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
37200 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
37210 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
37220 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
37230 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20     **      have 
37240 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65  also already bee
37250 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20  n taken care of 
37260 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
37270 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  l() code..    **
37280 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20  .    **   3) If 
37290 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
372a0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
372b0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
372c0 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a   pages of.    **
372d0 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72        cells stor
372e0 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e  ed on the siblin
372f0 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64  g pages may need
37300 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
37310 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
37320 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  4) If the siblin
37330 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
37340 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
37350 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a  nodes, then any.
37360 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72      **      over
37370 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20  flow pages used 
37380 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d  by these cells m
37390 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
373a0 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dated.    **    
373b0 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
373c0 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
373d0 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
373e0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
373f0 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
37400 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69  *   5) If the si
37410 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
37420 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
37430 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
37440 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74  .    **      ent
37450 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67  ries for the rig
37460 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ht-child pages o
37470 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d  f each sibling m
37480 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20  ay need.    **  
37490 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65      to be update
374a0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
374b0 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61   Cases 1 and 2 a
374c0 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62  re dealt with ab
374d0 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64  ove by other cod
374e0 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  e. The next.    
374f0 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  ** block deals w
37500 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20  ith cases 3 and 
37510 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66  4 and the one af
37520 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35  ter that, case 5
37530 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73  . Since.    ** s
37540 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  etting a pointer
37550 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20   map entry is a 
37560 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e  relatively expen
37570 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  sive operation, 
37580 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  this.    ** code
37590 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74   only sets point
375a0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
375b0 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  or child or over
375c0 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
375d0 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75  have.    ** actu
375e0 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65  ally moved betwe
375f0 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20  en pages.  */.  
37600 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
37610 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20  = apNew[0];.    
37620 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
37630 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69  apCopy[0];.    i
37640 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  nt nOverflow = p
37650 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
37660 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64      int iNextOld
37670 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   = pOld->nCell +
37680 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20   nOverflow;.    
37690 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20  int iOverflow = 
376a0 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c  (nOverflow ? pOl
376b0 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a 20 2d  d->aiOvfl[0] : -
376c0 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
376d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
376f0 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
37700 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
37710 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
37720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37730 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
37740 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
37750 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
37760 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
37770 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69        int isDivi
37780 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  der = 0;.      w
37790 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c  hile( i==iNextOl
377a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
377b0 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
377c0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
377d0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
377e0 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20  t cell on old.  
377f0 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
37800 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20   page j. If the 
37810 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
37820 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
37830 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
37840 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
37850 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69   cell i was a di
37860 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20  vider cell. */. 
37870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
37880 2b 31 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  +1 < ArraySize(a
37890 70 43 6f 70 79 29 20 29 3b 0a 20 20 20 20 20 20  pCopy) );.      
378a0 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20    assert( j+1 < 
378b0 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 20 20  nOld );.        
378c0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b  pOld = apCopy[++
378d0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78  j];.        iNex
378e0 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66  tOld = i + !leaf
378f0 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65  Data + pOld->nCe
37900 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ll + pOld->nOver
37910 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  flow;.        if
37920 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pOld->nOverflo
37930 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  w ){.          n
37940 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d  Overflow = pOld-
37950 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
37960 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20        iOverflow 
37970 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
37980 2b 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30  + pOld->aiOvfl[0
37990 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
379a0 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
379b0 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
379c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
379d0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
379e0 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
379f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
37a00 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
37a10 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 70  ld->aiOvfl[0]==p
37a20 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 2d 31  Old->aiOvfl[1]-1
37a30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37a40 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70  nOverflow<3 || p
37a50 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 3d 3d  Old->aiOvfl[1]==
37a60 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 32 5d 2d  pOld->aiOvfl[2]-
37a70 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  1);.      if( i=
37a80 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  =iOverflow ){.  
37a90 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
37aa0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
37ab0 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30   (--nOverflow)>0
37ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
37ad0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20  verflow++;.     
37ae0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
37af0 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65      if( i==cntNe
37b00 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  w[k] ){.        
37b10 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
37b20 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
37b30 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
37b40 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77  last cell on new
37b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
37b60 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74  ing page k. If t
37b70 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
37b80 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
37b90 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
37ba0 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
37bb0 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20  hen cell i is a 
37bc0 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a  divider cell.  *
37bd0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
37be0 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20   apNew[++k];.   
37bf0 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44 61       if( !leafDa
37c00 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ta ) continue;. 
37c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
37c20 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20  ert( j<nOld );. 
37c30 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
37c40 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  New );..      /*
37c50 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73   If the cell was
37c60 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69   originally divi
37c70 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73  der cell (and is
37c80 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20   not now) or.   
37c90 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f     ** an overflo
37ca0 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68  w cell, or if th
37cb0 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74  e cell was locat
37cc0 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ed on a differen
37cd0 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20  t sibling.      
37ce0 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20 74  ** page before t
37cf0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  he balancing, th
37d00 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  en the pointer m
37d10 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  ap entries assoc
37d20 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77  iated.      ** w
37d30 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72  ith any child or
37d40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
37d50 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
37d60 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  ed.  */.      if
37d70 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70  ( isDivider || p
37d80 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  Old->pgno!=pNew-
37d90 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
37da0 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63   if( !leafCorrec
37db0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
37dc0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
37dd0 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c   get4byte(apCell
37de0 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  [i]), PTRMAP_BTR
37df0 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  EE, pNew->pgno, 
37e00 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &rc);.        }.
37e10 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
37e20 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  ll[i]>pNew->minL
37e30 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
37e40 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
37e50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
37e60 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  i], &rc);.      
37e70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
37e80 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66  }..    if( !leaf
37e90 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
37ea0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
37eb0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  New; i++){.     
37ec0 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74     u32 key = get
37ed0 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d  4byte(&apNew[i]-
37ee0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
37ef0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
37f00 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42  t, key, PTRMAP_B
37f10 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e  TREE, apNew[i]->
37f20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
37f30 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30    }.    }..#if 0
37f40 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d  .    /* The ptrm
37f50 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20 63  apCheckPages() c
37f60 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28 29  ontains assert()
37f70 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
37f80 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20 20   verify that.   
37f90 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20   ** all pointer 
37fa0 6d 61 70 20 70 61 67 65 73 20 61 72 65 20 73 65  map pages are se
37fb0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69  t correctly. Thi
37fc0 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69  s is helpful whi
37fd0 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67  le .    ** debug
37fe0 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73  ging. This is us
37ff0 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62  ually disabled b
38000 65 63 61 75 73 65 20 61 20 63 6f 72 72 75 70 74  ecause a corrupt
38010 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20   database may.  
38020 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73    ** cause an as
38030 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
38040 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20   to fail.  */.  
38050 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
38060 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b  es(apNew, nNew);
38070 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b  .    ptrmapCheck
38080 50 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20  Pages(&pParent, 
38090 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  1);.#endif.  }..
380a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
380b0 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54  t->isInit );.  T
380c0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
380d0 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64  finished: old=%d
380e0 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
380f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
38100 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
38110 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43  ));..  /*.  ** C
38120 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65  leanup before re
38130 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61  turning..  */.ba
38140 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  lance_cleanup:. 
38150 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
38160 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66  ree(apCell);.  f
38170 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
38180 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
38190 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
381a0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
381b0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
381c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
381d0 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20  New[i]);.  }..  
381e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 69 66  return rc;.}.#if
381f0 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45   defined(_MSC_VE
38200 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e  R) && _MSC_VER >
38210 3d 20 31 37 30 30 20 26 26 20 64 65 66 69 6e 65  = 1700 && define
38220 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d  d(_M_ARM).#pragm
38230 61 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f  a optimize("", o
38240 6e 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  n).#endif.../*.*
38250 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
38260 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
38270 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
38280 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
38290 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c  re is.** overful
382a0 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  l (has one or mo
382b0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
382c0 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  s)..**.** A new 
382d0 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c  child page is al
382e0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
382f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
38300 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20  current root.** 
38310 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  page, including 
38320 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20  overflow cells, 
38330 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  are copied into 
38340 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72  the child. The r
38350 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74  oot.** page is t
38360 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20  hen overwritten 
38370 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d  to make it an em
38380 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68  pty page with th
38390 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a  e right-child .*
383a0 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  * pointer pointi
383b0 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ng to the new pa
383c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ge..**.** Before
383d0 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20   returning, all 
383e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
383f0 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
38400 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74  g to pages .** t
38410 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c  hat the new chil
38420 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61  d-page now conta
38430 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
38440 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65  are updated. The
38450 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73  .** entry corres
38460 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e