/ Hex Artifact Content
Login

Artifact 53eb576f72093d5138f5b7468994121c6eb6fe98:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f  >schemaFlags&DB_
1670: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30  SchemaLoaded)==0
1680: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1690: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  1;.  }..  /* Fig
16a0: 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74  ure out the root
16b0: 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20 6c  -page that the l
16c0: 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65  ock should be he
16d0: 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65  ld on. For table
16e0: 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74  .  ** b-trees, t
16f0: 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65 20  his is just the 
1700: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
1710: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65   b-tree being re
1720: 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74  ad or.  ** writt
1730: 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d  en. For index b-
1740: 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68 65  trees, it is the
1750: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1760: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  e associated.  *
1770: 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  * table.  */.  i
1780: 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20  f( isIndex ){.  
1790: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
17a0: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
17b0: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
17c0: 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20  a->idxHash); p; 
17d0: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
17e0: 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  (p)){.      Inde
17f0: 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78  x *pIdx = (Index
1800: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
1810: 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  a(p);.      if( 
1820: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74  pIdx->tnum==(int
1830: 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  )iRoot ){.      
1840: 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    iTab = pIdx->p
1850: 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Table->tnum;.   
1860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1870: 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69  se{.    iTab = i
1880: 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Root;.  }..  /* 
1890: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 72  Search for the r
18a0: 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69  equired lock. Ei
18b0: 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63  ther a write-loc
18c0: 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69  k on root-page i
18d0: 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69  Tab, a .  ** wri
18e0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73  te-lock on the s
18f0: 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20  chema table, or 
1900: 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69  (if the client i
1910: 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a  s reading) a.  *
1920: 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69  * read-lock on i
1930: 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65  Tab will suffice
1940: 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e  . Return 1 if an
1950: 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 66  y of these are f
1960: 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  ound.  */.  for(
1970: 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42  pLock=pBtree->pB
1980: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
1990: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
19a0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  ext){.    if( pL
19b0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74  ock->pBtree==pBt
19c0: 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c  ree .     && (pL
19d0: 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ock->iTable==iTa
19e0: 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f  b || (pLock->eLo
19f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26  ck==WRITE_LOCK &
1a00: 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d  & pLock->iTable=
1a10: 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f  =1)).     && pLo
1a20: 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b  ck->eLock>=eLock
1a30: 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Type .    ){.   
1a40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1a50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69   }.  }..  /* Fai
1a60: 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  led to find the 
1a70: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a  required lock. *
1a80: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1a90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1aa0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  _DEBUG */..#ifde
1ab0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1ac0: 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63  *.**** This func
1ad0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64  tion may be used
1ae0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
1af0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b00: 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  only. ****.**.**
1b10: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b20: 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c 65  it would be ille
1b30: 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74  gal for pBtree t
1b40: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
1b50: 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  .** table or ind
1b60: 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52 6f  ex rooted at iRo
1b70: 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65 72  ot because other
1b80: 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69   shared connecti
1b90: 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75 6c  ons are.** simul
1ba0: 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69 6e  taneously readin
1bb0: 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62 6c  g that same tabl
1bc0: 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e or index..**.*
1bd0: 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
1be0: 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72  for pBtree to wr
1bf0: 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ite if some othe
1c00: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 74  r Btree object t
1c10: 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74 68  hat.** shares th
1c20: 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64 20  e same BtShared 
1c30: 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65 6e  object is curren
1c40: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 77  tly reading or w
1c50: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69 52  riting.** the iR
1c60: 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63 65  oot table.  Exce
1c70: 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65 72  pt, if the other
1c80: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68 61   Btree object ha
1c90: 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75 6e  s the.** read-un
1ca0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
1cb0: 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 4f  et, then it is O
1cc0: 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 20  K for the other 
1cd0: 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61 76  object to.** hav
1ce0: 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72 2e  e a read cursor.
1cf0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1d00: 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74 69  le, before writi
1d10: 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20 6f  ng to any part o
1d20: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
1d30: 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20 61  ndex.** rooted a
1d40: 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f 6e  t page iRoot, on
1d50: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a 2a  e should call:.*
1d60: 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20  *.**    assert( 
1d70: 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1d80: 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 29  s(pBtree, iRoot)
1d90: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
1da0: 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63  t hasReadConflic
1db0: 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  ts(Btree *pBtree
1dc0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20  , Pgno iRoot){. 
1dd0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1de0: 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1df0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1e00: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1e10: 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1e20: 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26 20  =iRoot .     && 
1e30: 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72 65  p->pBtree!=pBtre
1e40: 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70 2d  e.     && 0==(p-
1e50: 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61  >pBtree->db->fla
1e60: 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64  gs & SQLITE_Read
1e70: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20  Uncommitted).   
1e80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e90: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1ea0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1eb0: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
1ec0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1ed0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
1ee0: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
1ef0: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
1f00: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
1f10: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
1f20: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
1f30: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
1f40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
1f50: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
1f60: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
1f70: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
1f80: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
1f90: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
1fa0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
1fb0: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
1fc0: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
1fd0: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
1fe0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1ff0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2000: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
2010: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2020: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
2030: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2040: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2050: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2060: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2070: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2080: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2090: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
20a0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
20b0: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
20c0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
20d0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c 7c  adUncommitted)||
20e0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
20f0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
2100: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
2110: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2120: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2130: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2140: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2150: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2160: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2170: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2180: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2190: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
21a0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
21b0: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
21c0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
21d0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
21e0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
21f0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
2200: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
2210: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2220: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2230: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2240: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2250: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2260: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2270: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2280: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2290: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
22a0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
22b0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
22c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
22e0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
22f0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
2300: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2310: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2320: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2330: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2340: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2350: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2360: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2370: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2390: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
23a0: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
23b0: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
23c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
23d0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
23e0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
23f0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2400: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2410: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2420: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2430: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2440: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2450: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2460: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2470: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2480: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2490: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
24a0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
24b0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
24c0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
24d0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
24e0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
24f0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
2500: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
2510: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2520: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2530: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2540: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2550: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2560: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2570: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2580: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2590: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
25a0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
25b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
25c0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
25d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
25e0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
25f0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
2600: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2610: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2620: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2630: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2640: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2650: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2670: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2680: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2690: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
26a0: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
26b0: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
26c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
26d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
26e0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
26f0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
2700: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
2710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2720: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2730: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2750: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2770: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2780: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2790: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
27a0: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
27b0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
27c0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
27d0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
27e0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
27f0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
2800: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
2810: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2820: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2830: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2840: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2850: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2860: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2870: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2880: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2890: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
28a0: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
28b0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
28c0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
28d0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
28e0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
28f0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
2900: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
2910: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2920: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2930: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2940: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2950: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2960: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2970: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2980: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2990: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
29a0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
29b0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29c0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
29d0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
29e0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
29f0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2a00: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2a10: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2a20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2a50: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2a60: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2a70: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2a80: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2a90: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2aa0: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2ab0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ac0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2ad0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2ae0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2af0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2b10: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2b20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2b30: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2b40: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2b50: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2b60: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2b70: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2b80: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2b90: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2ba0: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2bb0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2bc0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2bd0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2be0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2bf0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2c00: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2c10: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2c20: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2c30: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2c40: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2c50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2c60: 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  d) || eLock==WRI
2c70: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  TE_LOCK );..  /*
2c80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2c90: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2ca0: 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62  lled on a sharab
2cb0: 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20  le b-tree after 
2cc0: 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  it .  ** has bee
2cd0: 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  n determined tha
2ce0: 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65  t no other b-tre
2cf0: 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69  e holds a confli
2d00: 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a  cting lock.  */.
2d10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61    assert( p->sha
2d20: 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  rable );.  asser
2d30: 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75  t( SQLITE_OK==qu
2d40: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
2d50: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
2d60: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
2d70: 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20  /* First search 
2d80: 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20  the list for an 
2d90: 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e  existing lock on
2da0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
2db0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
2dc0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2dd0: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2de0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  t){.    if( pIte
2df0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
2e00: 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72  e && pIter->pBtr
2e10: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70  ee==p ){.      p
2e20: 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20  Lock = pIter;.  
2e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2e50: 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64  e above search d
2e60: 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74  id not find a Bt
2e70: 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f  Lock struct asso
2e80: 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a  ciating Btree p.
2e90: 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20    ** with table 
2ea0: 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65  iTable, allocate
2eb0: 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74   one and link it
2ec0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a   into the list..
2ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63    */.  if( !pLoc
2ee0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  k ){.    pLock =
2ef0: 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74   (BtLock *)sqlit
2f00: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
2f10: 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20  eof(BtLock));.  
2f20: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
2f30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2f50: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  .    pLock->iTab
2f60: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
2f70: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d   pLock->pBtree =
2f80: 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70   p;.    pLock->p
2f90: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
2fa0: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63  k;.    pBt->pLoc
2fb0: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = pLock;.  }..
2fc0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c    /* Set the BtL
2fd0: 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ock.eLock variab
2fe0: 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  le to the maximu
2ff0: 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  m of the current
3000: 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74   lock.  ** and t
3010: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
3020: 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  k. This means if
3030: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61   a write-lock wa
3040: 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20  s already held. 
3050: 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c   ** and a read-l
3060: 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77  ock requested, w
3070: 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63  e don't incorrec
3080: 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68  tly downgrade th
3090: 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61  e lock..  */.  a
30a0: 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43  ssert( WRITE_LOC
30b0: 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20  K>READ_LOCK );. 
30c0: 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b   if( eLock>pLock
30d0: 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ->eLock ){.    p
30e0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c  Lock->eLock = eL
30f0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ock;.  }..  retu
3100: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3110: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
3120: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3130: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
3140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3150: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52  ED_CACHE./*.** R
3160: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74  elease all the t
3170: 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b  able locks (lock
3180: 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63  s obtained via c
3190: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73  alls to.** the s
31a0: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
31b0: 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75  leLock() procedu
31c0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
31d0: 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a  e object p..**.*
31e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72  assumes that Btr
3200: 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e  ee p has an open
3210: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a   read or write .
3220: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3230: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20  If it does not, 
3240: 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e  then the BTS_PEN
3250: 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79  DING flag.** may
3260: 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   be incorrectly 
3270: 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
3280: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c  ic void clearAll
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
32b0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32c0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
32d0: 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26  ock **ppIter = &
32e0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61  pBt->pLock;..  a
32f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
3300: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
3310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3320: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d  >sharable || 0==
3330: 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73  *ppIter );.  ass
3340: 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
3350: 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  0 );..  while( *
3360: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
3370: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
3380: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
3390: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
33a0: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
33b0: 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  E)==0 || pBt->pW
33c0: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
33d0: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
33e0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
33f0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
3400: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
3410: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
3420: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
3430: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
3440: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
3450: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
3460: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
3470: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
3480: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
3490: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
34a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
34b0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
34c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
34d0: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
34e0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
34f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ..  assert( (pBt
3500: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3510: 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20  _PENDING)==0 || 
3520: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
3530: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3540: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74  er==p ){.    pBt
3550: 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20  ->pWriter = 0;. 
3560: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3570: 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53   &= ~(BTS_EXCLUS
3580: 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29  IVE|BTS_PENDING)
3590: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
35a0: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
35b0: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
35c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
35d0: 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20  lled when Btree 
35e0: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
35f0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
3600: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
3610: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
3620: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
3630: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
3640: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3650: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3660: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3670: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3680: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3690: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
36a0: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
36b0: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
36c0: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
36d0: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
36e0: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
36f0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
3700: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
3710: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
3720: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73   BTS_PENDING mus
3730: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3740: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3750: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3760: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3770: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3780: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3790: 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a  = ~BTS_PENDING;.
37a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
37b0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67  s function chang
37c0: 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63  es all write-loc
37d0: 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  ks held by Btree
37e0: 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63   p into read-loc
37f0: 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ks..*/.static vo
3800: 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  id downgradeAllS
3810: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3820: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3830: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3840: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
3850: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3860: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3870: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
3880: 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Writer = 0;.    
3890: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
38a0: 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45   ~(BTS_EXCLUSIVE
38b0: 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20  |BTS_PENDING);. 
38c0: 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74     for(pLock=pBt
38d0: 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20  ->pLock; pLock; 
38e0: 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65  pLock=pLock->pNe
38f0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
3900: 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d  t( pLock->eLock=
3910: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  =READ_LOCK || pL
3920: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3930: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65  ;.      pLock->e
3940: 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
3950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
3960: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3970: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3980: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
3990: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
39a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
39b0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
39c0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
39d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
39e0: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
39f0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3a00: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3a10: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3a20: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3a30: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3a40: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3a50: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3a60: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3a70: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3a80: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3a90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3aa0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
3ab0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3ac0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3ad0: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3ae0: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3af0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3b00: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3b10: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3b20: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3b30: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3b40: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3b50: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3b60: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3b70: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3b80: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3b90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3ba0: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3bb0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3bc0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bd0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3be0: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3bf0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3c00: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3c10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3c20: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3c30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3c50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3c60: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3c70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3c80: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
3c90: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
3ca0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3cb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
3cc0: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
3cd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3ce0: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
3cf0: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
3d00: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
3d10: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
3d20: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
3d30: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
3d40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
3d50: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
3d60: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
3d70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
3d80: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
3d90: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
3da0: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
3db0: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
3dc0: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
3dd0: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
3de0: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
3df0: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
3e00: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
3e10: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
3e20: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
3e30: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
3e40: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
3e50: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
3e60: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3e70: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
3e80: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
3e90: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
3ea0: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
3eb0: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
3ec0: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
3ed0: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
3ee0: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
3ef0: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
3f00: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
3f10: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3f20: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
3f30: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
3f40: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
3f50: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
3f60: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
3f70: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
3f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
3f90: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
3fa0: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
3fb0: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
3fc0: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
3fd0: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
3fe0: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
3ff0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4000: 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
4010: 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
4020: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
4030: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
4040: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4050: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
4060: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
4070: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  xt){.    if( (p-
4080: 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
4090: 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 26 26  _Incrblob)!=0 &&
40a0: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
40b0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
40c0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
40d0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
40e0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
40f0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
4100: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
4110: 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69   when INCRBLOB i
4120: 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23  s omitted */.  #
4130: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
4140: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
4150: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
4160: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
4170: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
4180: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
4190: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
41a0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
41b0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
41c0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
41d0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
41e0: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
41f0: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
4200: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
4210: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
4220: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4230: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
4240: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
4250: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
4260: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
4270: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
4280: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
4290: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
42a0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
42b0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
42c0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
42d0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
42e0: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
42f0: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
4300: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
4310: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4320: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
4330: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
4340: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
4350: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
4360: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
4370: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
4380: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
4390: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
43a0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
43b0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
43c0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
43d0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
43e0: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
43f0: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4400: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4410: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4420: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4430: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4440: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4450: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4460: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4470: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4480: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
4490: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
44a0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
44b0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
44c0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
44d0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
44e0: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
44f0: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4500: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4510: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4520: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4530: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4540: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4550: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4560: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4570: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
4580: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
4590: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
45a0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
45b0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
45c0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
45d0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
45e0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
45f0: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4600: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4610: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4620: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4630: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4640: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4650: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4660: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4670: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
4680: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
4690: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
46a0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
46b0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
46c0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
46d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
46e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
46f0: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4700: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4710: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4720: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4730: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4740: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4750: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4760: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4770: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
4780: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
4790: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
47a0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
47b0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
47c0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
47d0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
47e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
47f0: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4800: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4810: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4820: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4830: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4840: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4850: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4860: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4870: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
4880: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4890: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
48a0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
48b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
48c0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
48d0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
48e0: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
48f0: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4900: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4910: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4920: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4930: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4940: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4950: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4960: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4970: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4980: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
4990: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
49a0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49b0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
49c0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
49d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
49e0: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
49f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4a00: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4a10: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a20: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4a30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4a40: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4a50: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4a60: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4a70: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
4a80: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
4a90: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
4aa0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
4ab0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
4ac0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
4ad0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4ae0: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4af0: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4b00: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4b10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4b20: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4b30: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4b40: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4b50: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4b60: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4b70: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
4b80: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
4b90: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
4ba0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
4bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
4bc0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
4bd0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4be0: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4bf0: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4c00: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4c10: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4c20: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4c40: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4c50: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4c60: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4c70: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
4c80: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
4c90: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ca0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
4cb0: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20   Release all of 
4cc0: 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67  the apPage[] pag
4cd0: 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e  es for a cursor.
4ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4cf0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
4d00: 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75 72  ursorPages(BtCur
4d10: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4d20: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4d30: 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
4d40: 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
4d50: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
4d60: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72  ge[i]);.    pCur
4d70: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4d80: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61  .  }.  pCur->iPa
4d90: 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ge = -1;.}.../*.
4da0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
4db0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
4dc0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
4dd0: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
4de0: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
4df0: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
4e00: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
4e10: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
4e20: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
4e30: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
4e40: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
4e50: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
4e60: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
4e70: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
4e80: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
4e90: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
4ea0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
4eb0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
4ec0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4ed0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
4ee0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
4ef0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
4f00: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
4f10: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
4f20: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
4f30: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
4f40: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
4f50: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
4f60: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
4f70: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
4f80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
4f90: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
4fa0: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
4fb0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
4fc0: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
4fd0: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
4fe0: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
4ff0: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5000: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5010: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
5020: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
5030: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
5040: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
5050: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
5060: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
5070: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5080: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5090: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
50a0: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
50b0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
50c0: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
50d0: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
50e0: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
50f0: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5100: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5110: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69  qlite3Malloc( (i
5120: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b  nt)pCur->nKey );
5130: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
5140: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5150: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
5160: 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e  , 0, (int)pCur->
5170: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20  nKey, pKey);.   
5180: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5190: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
51a0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65  pCur->pKey = pKe
51b0: 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
51c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
51d0: 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20  free(pKey);.    
51e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
51f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5200: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5210: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
5220: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5230: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
5240: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
5250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5260: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5270: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
5280: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
5290: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
52a0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
52b0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
52c0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
52d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
52e0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
52f0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5300: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5310: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5320: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5330: 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72  he table  with r
5340: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
5350: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
5360: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
5370: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
5380: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5390: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
53a0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
53b0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
53c0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
53d0: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
53e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
53f0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
5400: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
5410: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
5420: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5430: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5440: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5450: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
5460: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
5470: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
5480: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
5490: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
54a0: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
54b0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
54c0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
54d0: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
54e0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
54f0: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5500: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
5510: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5520: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
5530: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
5540: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5550: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
5560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5570: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5580: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
5590: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
55a0: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
55b0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
55c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
55d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
55e0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
55f0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5600: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
5610: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
5620: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
5630: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
5640: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5650: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
5660: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
5670: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
5680: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
5690: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
56a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
56b0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
56c0: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
56d0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
56e0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
56f0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
5700: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
5710: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
5720: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
5730: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
5740: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
5750: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
5760: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
5770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5780: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
5790: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
57a0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
57b0: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
57c0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
57d0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
57e0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
57f0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
5800: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
5810: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
5820: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
5830: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
5840: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
5850: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
5860: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
5870: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
5880: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
5890: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
58a0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
58b0: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
58c0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
58d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
58f0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
5900: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
5910: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
5920: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
5930: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
5940: 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20  e[200];         
5950: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
5960: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
5970: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
5980: 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20  /.  char *pFree 
5990: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79  = 0;..  if( pKey
59a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
59b0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
59c0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
59d0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
59e0: 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
59f0: 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43  cord(.        pC
5a00: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53  ur->pKeyInfo, aS
5a10: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5a20: 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20  ace), &pFree.   
5a30: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
5a40: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
5a50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
5a70: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
5a80: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
5a90: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
5aa0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
5ab0: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
5ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5ad0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
5ae0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
5af0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5b00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5b10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  KPT;.    }.  }el
5b20: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b40: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b50: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b60: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b70: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b80: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5ba0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5bb0: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5bc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bd0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5be0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bf0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5c00: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5c10: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c20: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c30: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c40: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c50: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c60: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c70: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c80: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5ca0: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5cb0: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5cc0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5ce0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cf0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5d00: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5d10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d20: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d30: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d40: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d80: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d90: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5da0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5db0: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5dd0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5de0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5df0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5e00: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5e10: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e20: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e30: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e40: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e70: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e80: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e90: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5ea0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5eb0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ec0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5ed0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
5ee0: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
5ef0: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
5f00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5f10: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
5f20: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5f30: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
5f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5f50: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5f60: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5f70: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5f80: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5f90: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5fa0: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5fb0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5fc0: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5fd0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5fe0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5ff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6000: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6010: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6020: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
6030: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
6040: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6050: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6060: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
6070: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6080: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
60a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
60b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
60c0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
60d0: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
60e0: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
60f0: 73 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  s set as follows
6100: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 20  :.**.**    0:   
6110: 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 6e  The cursor is un
6120: 63 68 61 6e 67 65 64 0a 2a 2a 20 20 20 20 31 3a  changed.**    1:
6130: 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
6140: 20 73 74 69 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   still pointing 
6150: 61 74 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2c  at the same row,
6160: 20 62 75 74 20 74 68 65 20 70 6f 69 6e 74 65 72   but the pointer
6170: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 74  s.**         ret
6180: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
6190: 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 29 20  BtreeKeyFetch() 
61a0: 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  or sqlite3BtreeD
61b0: 61 74 61 46 65 74 63 68 28 29 0a 2a 2a 20 20 20  ataFetch().**   
61c0: 20 20 20 20 20 20 6d 69 67 68 74 20 6e 6f 77 20        might now 
61d0: 62 65 20 69 6e 76 61 6c 69 64 20 62 65 63 61 75  be invalid becau
61e0: 73 65 20 6f 66 20 61 20 62 61 6c 61 6e 63 65 28  se of a balance(
61f0: 29 20 6f 72 20 6f 74 68 65 72 20 63 68 61 6e 67  ) or other chang
6200: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  e to the.**     
6210: 20 20 20 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 20      b-tree..**  
6220: 20 20 32 3a 20 20 20 54 68 65 20 63 75 72 73 6f    2:   The curso
6230: 72 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 70  r is no longer p
6240: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 72  ointing to the r
6250: 6f 77 2e 20 20 54 68 65 20 72 6f 77 20 6d 69 67  ow.  The row mig
6260: 68 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20  ht have.**      
6270: 20 20 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20     been deleted 
6280: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
6290: 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 69 6e  he cursor..*/.in
62a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
62b0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
62c0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
62d0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
62e0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
62f0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6300: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6310: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b   *pHasMoved = 0;
6320: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6330: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
6340: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
6350: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
6360: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
6370: 70 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b 0a 20  pHasMoved = 2;. 
6380: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6390: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
63a0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
63b0: 49 44 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72  ID || NEVER(pCur
63c0: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29  ->skipNext!=0) )
63d0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
63e0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
63f0: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
6400: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
6420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6430: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
6440: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
6450: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
6460: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
6470: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
6480: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
6490: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
64a0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
64b0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
64c0: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
64d0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
64e0: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
64f0: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
6500: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
6510: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
6520: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
6530: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
6540: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
6550: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
6560: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
6570: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
6580: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
6590: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
65a0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
65b0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
65c0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
65d0: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
65e0: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
65f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6600: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6610: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
6620: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
6630: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6640: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
6650: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
6660: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
6670: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
6680: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
6690: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
66a0: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
66b0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
66c0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
66d0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
66e0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
66f0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
6700: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
6710: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6720: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
6730: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
6740: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6750: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
6760: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
6770: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
6780: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
6790: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
67a0: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
67b0: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
67c0: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
67d0: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
67e0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
67f0: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
6800: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
6810: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6820: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
6830: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
6840: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6850: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
6860: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6870: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
6880: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
6890: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
68a0: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
68b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
68c0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
68d0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
68e0: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
68f0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
6900: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
6910: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
6920: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
6930: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
6940: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
6950: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6960: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
6970: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
6980: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
6990: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
69a0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
69b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
69c0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
69d0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
69e0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
69f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
6a00: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
6a10: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
6a20: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
6a30: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
6a40: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
6a50: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
6a60: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
6a70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
6a80: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
6a90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6aa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6ab0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
6ac0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
6ad0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6ae0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6af0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6b00: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6b10: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6b20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6b30: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
6b40: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
6b50: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
6b60: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
6b70: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
6b80: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
6b90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6ba0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6bb0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
6bc0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
6bd0: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6be0: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6bf0: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
6c00: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6c10: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6c20: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6c30: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6c40: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
6c50: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6c60: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
6c70: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
6c80: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
6c90: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
6ca0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6cb0: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6cc0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6cd0: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6ce0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6cf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6d00: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6d10: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6d20: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6d30: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
6d50: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
6d60: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6d70: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
6d80: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
6d90: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
6da0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6db0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6dc0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6dd0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6de0: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6df0: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6e00: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6e10: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6e20: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6e30: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6e40: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6e50: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6e60: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
6e70: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
6e80: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6e90: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
6ea0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6eb0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6ec0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6ed0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6ee0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6ef0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6f00: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6f10: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6f20: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6f30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6f40: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6f50: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6f60: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6f70: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6f80: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
6f90: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
6fa0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6fb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6fc0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6fd0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6fe0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6ff0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
7000: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
7010: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
7020: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
7030: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
7040: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7050: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
7060: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
7070: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
7080: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
7090: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
70a0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
70b0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
70c0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
70d0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
70e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
70f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7100: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
7110: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
7120: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
7130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
7140: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
7150: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
7160: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
7170: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
7180: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7190: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
71a0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
71b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
71c0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
71d0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
71e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
71f0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
7200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
7210: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
7220: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7230: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
7240: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
7250: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
7260: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
7270: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
7280: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
7290: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
72a0: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
72b0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
72c0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
72d0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
72e0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
72f0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
7300: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
7310: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
7320: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
7330: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
7340: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
7350: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7360: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
7370: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
7380: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
7390: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
73a0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
73b0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
73c0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
73d0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
73e0: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
73f0: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
7400: 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d  e findCellv2(D,M
7410: 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32  ,O,I) (D+(M&get2
7420: 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29  byte(D+(O+2*(I))
7430: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
7440: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
7450: 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43  version of findC
7460: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
7470: 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68   for.** pages th
7480: 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76  at do contain ov
7490: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
74a0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
74b0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
74c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
74d0: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
74e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
74f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7500: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
7510: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
7520: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
7530: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
7540: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20   int k;.    k = 
7550: 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d  pPage->aiOvfl[i]
7560: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
7570: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
7580: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
7590: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
75a0: 2d 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->apOvfl[i];.   
75b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
75c0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
75d0: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
75e0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
7600: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
7610: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
7620: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
7630: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
7640: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
7650: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
7660: 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43  on.  btreeParseC
7670: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
7680: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
7690: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
76a0: 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72  ent and btreePar
76b0: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
76c0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
76d0: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
76e0: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
76f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
7700: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
7710: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
7720: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
7730: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
7740: 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50  ead of.** btreeP
7750: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
7760: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
7770: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
7780: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61  e faster..*/.sta
7790: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
77a0: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
77b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
77c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
77d0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
77e0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
77f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7800: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
7810: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
7820: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7830: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7840: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7850: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
7860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7870: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
7880: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
7890: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
78a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
78b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
78c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
78d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
78e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
78f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7900: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7910: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
7920: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
7930: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
7940: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
7950: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
7960: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7970: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
7980: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
7990: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
79a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
79b0: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
79c0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
79d0: 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( n==0 );.      
79e0: 6e 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  n = getVarint32(
79f0: 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f 61 64 29  pCell, nPayload)
7a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7a10: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
7a20: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
7a30: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
7a40: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
7a50: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
7a60: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
7a70: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
7a80: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7a90: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
7aa0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
7ab0: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
7ac0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
7ad0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7ae0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
7af0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
7b00: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
7b10: 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28  = n;.  testcase(
7b20: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
7b30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7b40: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
7b50: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
7b60: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c  cal+1 );.  if( l
7b70: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
7b80: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
7b90: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
7ba0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
7bb0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
7bc0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
7bd0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
7be0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7bf0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
7c00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
7c10: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66  */.    if( (pInf
7c20: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
7c30: 28 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20  (n+nPayload))<4 
7c40: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
7c50: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
7c60: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
7c70: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
7c80: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
7c90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7ca0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
7cb0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
7cc0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
7cd0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
7ce0: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
7cf0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
7d00: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
7d10: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
7d20: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
7d30: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7d40: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
7d50: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
7d60: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
7d70: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
7d80: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
7d90: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
7da0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
7db0: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
7dc0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
7dd0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
7de0: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
7df0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
7e00: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
7e10: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
7e20: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
7e30: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
7e40: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
7e50: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
7e60: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
7e70: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
7e80: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
7e90: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ea0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7eb0: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
7ec0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
7ed0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ee0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7ef0: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
7f00: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
7f10: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
7f20: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
7f30: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
7f40: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7f50: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
7f60: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7f70: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
7f80: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
7f90: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
7fa0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
7fb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7fc0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7fd0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
7fe0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
7ff0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8000: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8010: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
8020: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
8030: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8040: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8060: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8070: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8080: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
8090: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
80a0: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
80b0: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
80c0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
80d0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
80e0: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
80f0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
8100: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
8110: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8120: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
8130: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
8140: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
8150: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ).static void bt
8160: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
8170: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8180: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8190: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
81a0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
81b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
81c0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
81d0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
81e0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
81f0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8200: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8210: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8220: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
8230: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
8240: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
8250: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
8260: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
8270: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
8280: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
8290: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
82a0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
82b0: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
82c0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
82d0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
82e0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
82f0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
8300: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
8310: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
8320: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
8330: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
8340: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
8350: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
8360: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
8370: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
8380: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
8390: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
83a0: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
83b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
83c0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
83d0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
83e0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
83f0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
8400: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
8410: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
8420: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
8430: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
8440: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
8450: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
8460: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
8470: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
8480: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
8490: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
84a0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
84b0: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
84c0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
84d0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
84e0: 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72  info;.  btreePar
84f0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
8500: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
8510: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
8520: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8530: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
8540: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
8550: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
8560: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8570: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8580: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
8590: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
85a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
85b0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
85c0: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
85d0: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
85e0: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
85f0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
8600: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
8610: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
8620: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
8630: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
8640: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
8650: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
8660: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
8670: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8680: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8690: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
86a0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
86b0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
86c0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
86d0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
86e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
86f0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8700: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8710: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8720: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8730: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
8740: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
8750: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
8760: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8770: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
8780: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
8790: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
87a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
87b0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
87c0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
87d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
87e0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
87f0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8800: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8810: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
8820: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8830: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
8840: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
8850: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
8860: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
8870: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8880: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
8890: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
88a0: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
88b0: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
88c0: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
88d0: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
88e0: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
88f0: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
8900: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
8910: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8920: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
8930: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
8940: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
8950: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
8960: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
8970: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
8980: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
8990: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
89a0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
89b0: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
89c0: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
89d0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
89e0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
89f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8a00: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
8a10: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
8a20: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
8a30: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
8a40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
8a50: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
8a60: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
8a70: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
8a80: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
8a90: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
8aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8ab0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8ac0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8ad0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
8ae0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
8af0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
8b00: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
8b10: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
8b20: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
8b30: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
8b40: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
8b50: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
8b60: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
8b70: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
8b80: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
8b90: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
8ba0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
8bb0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
8bc0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
8bd0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
8be0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
8bf0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
8c00: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
8c10: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
8c20: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
8c30: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
8c40: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
8c50: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
8c60: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
8c70: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
8c80: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
8c90: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
8ca0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
8cb0: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
8cc0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
8cd0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
8ce0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
8cf0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
8d00: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
8d10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
8d20: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
8d30: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8d40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8d60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
8d70: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
8d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8d90: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
8da0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
8db0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8dc0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
8dd0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
8de0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
8e10: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
8e20: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
8e30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8e40: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
8e50: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
8e60: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
8e70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8e80: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
8e90: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
8ea0: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8ec0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
8ed0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
8ee0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
8f10: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
8f20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8f30: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
8f40: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
8f50: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8f60: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
8f70: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
8f80: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
8f90: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
8fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8fb0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
8fc0: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
8fd0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8ff0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
9000: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
9010: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9020: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9030: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9040: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9050: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
9060: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9070: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
9080: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9090: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
90a0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
90b0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
90c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
90d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
90e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
90f0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
9100: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
9110: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
9120: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
9130: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
9140: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
9150: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
9160: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
9170: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
9180: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
9190: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
91a0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
91b0: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
91c0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
91d0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
91e0: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
91f0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9200: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
9210: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
9220: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
9230: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
9240: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
9250: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
9260: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
9270: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
9280: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
9290: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
92a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
92b0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
92c0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
92d0: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
92e0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
92f0: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
9300: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
9310: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
9320: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
9330: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
9340: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
9350: 20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   );.#if !defined
9360: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
9370: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
9380: 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65  CK).    /* These
9390: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
93a0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
93b0: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
93c0: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
93d0: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
93e0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
93f0: 43 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64  CHECK is defined
9400: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
9410: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
9420: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
9430: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9440: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9450: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
9460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
9470: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
9480: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
9490: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
94a0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
94b0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
94c0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20  rk -= size;.#if 
94d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
94e0: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
94f0: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69  ELL_CHECK).    i
9500: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
9510: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9520: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9530: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9540: 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b  lse.    if( cbrk
9550: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
9560: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
9570: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
9580: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9590: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
95a0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
95b0: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
95c0: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
95d0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
95e0: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
95f0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
9600: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9610: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
9620: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d  eSize );.    mem
9630: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
9640: 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65   &temp[pc], size
9650: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
9660: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
9670: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
9680: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
9690: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
96a0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
96b0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
96c0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
96d0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
96e0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
96f0: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
9700: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
9710: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
9720: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9730: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9740: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9750: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
9760: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
9770: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
9780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9790: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
97a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
97b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
97c0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
97d0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
97e0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
97f0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
9800: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9810: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
9820: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
9830: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
9840: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
9850: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
9860: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
9870: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
9880: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
9890: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
98a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
98b0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
98c0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
98d0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
98e0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
98f0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
9900: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
9910: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
9920: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
9930: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
9940: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
9950: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
9960: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
9970: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
9980: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
9990: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
99a0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
99b0: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
99c0: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
99d0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
99e0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
99f0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
9a00: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
9a10: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
9a20: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
9a30: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
9a40: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
9a50: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
9a60: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
9a70: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
9a80: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
9a90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9aa0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
9ab0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
9ac0: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
9ad0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
9ae0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
9af0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
9b00: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
9b10: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9b40: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
9b50: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
9b60: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
9b70: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9b80: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
9b90: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
9ba0: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
9bb0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
9bc0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
9bd0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9be0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
9bf0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
9c00: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
9c10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9c20: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9c30: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9c40: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
9c50: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
9c60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9c70: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9c80: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9c90: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
9ca0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
9cb0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
9cc0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
9cd0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
9ce0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
9cf0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
9d00: 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ==0 );.  usableS
9d10: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
9d20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
9d30: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20  assert( nByte < 
9d40: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
9d50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9d60: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
9d70: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
9d80: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
9d90: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
9da0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
9db0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
9dc0: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
9dd0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9de0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9df0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
9e00: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
9e10: 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36  ){.      top = 6
9e20: 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  5536;.    }else{
9e30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9e40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9e50: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
9e60: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65  /* If there is e
9e70: 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77  nough space betw
9e80: 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20  een gap and top 
9e90: 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c  for one more cel
9ea0: 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61  l pointer.  ** a
9eb0: 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65  rray entry offse
9ec0: 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72  t, and if the fr
9ed0: 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d  eelist is not em
9ee0: 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68  pty, then search
9ef0: 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69   the.  ** freeli
9f00: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9f10: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9f20: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9f30: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
9f40: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
9f50: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
9f60: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
9f70: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9f80: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
9f90: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
9fa0: 26 26 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20  && (data[hdr+1] 
9fb0: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20  || data[hdr+2]) 
9fc0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  ){.    int pc, a
9fd0: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
9fe0: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
9ff0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
a000: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
a010: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
a020: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a030: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
a040: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
a050: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
a060: 65 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34  e-4 || pc<addr+4
a070: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
a080: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a090: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
a0a0: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
a0b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a0c0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
a0d0: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
a0e0: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a       int x = siz
a0f0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
a100: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
a110: 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4 );.        tes
a120: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
a130: 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29         if( x<4 )
a140: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a150: 64 61 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30 20  data[hdr+7]>=60 
a160: 29 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e  ) goto defragmen
a170: 74 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  t_page;.        
a180: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
a190: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
a1a0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
a1b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
a1c0: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
a1d0: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
a1e0: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
a1f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
a200: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
a210: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
a220: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
a230: 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20  7] += (u8)x;.   
a240: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
a250: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
a260: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
a270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a290: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
a2b0: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
a2c0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
a2d0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
a2e0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
a2f0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
a300: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
a310: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
a320: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
a330: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a340: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
a350: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
a360: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
a370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a380: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
a390: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
a3a0: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
a3b0: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
a3c0: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
a3d0: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
a3e0: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
a3f0: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
a400: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
a410: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
a420: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
a430: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
a440: 74 6f 70 20 29 7b 0a 64 65 66 72 61 67 6d 65 6e  top ){.defragmen
a450: 74 5f 70 61 67 65 3a 0a 20 20 20 20 74 65 73 74  t_page:.    test
a460: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
a470: 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ll==0 );.    rc 
a480: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
a490: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
a4a0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a4b0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
a4c0: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
a4d0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
a4e0: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
a4f0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
a500: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
a510: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
a520: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
a530: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a540: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
a550: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a560: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
a570: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
a580: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
a590: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
a5a0: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
a5b0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
a5c0: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
a5d0: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
a5e0: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
a5f0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
a600: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
a610: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
a620: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
a630: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
a640: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
a650: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
a660: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a670: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a680: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
a690: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
a6a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a6b0: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
a6c0: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
a6d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a6e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
a6f0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
a700: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
a710: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
a720: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
a730: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
a740: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b   is pPage->aDisk
a750: 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  [start].** and t
a760: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
a770: 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62  lock is "size" b
a780: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
a790: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
a7a0: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
a7b0: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
a7c0: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
a7d0: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
a7e0: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
a7f0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a800: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
a810: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73  ge *pPage, int s
a820: 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b  tart, int size){
a830: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65  .  int addr, pbe
a840: 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20  gin, hdr;.  int 
a850: 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  iLast;          
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a870: 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   Largest possibl
a880: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  e freeblock offs
a890: 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  et */.  unsigned
a8a0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
a8b0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
a8c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
a8d0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
a8e0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
a8f0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
a900: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
a910: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
a920: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
a930: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
a940: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
a950: 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29  ( (start + size)
a960: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
a970: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a980: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a990: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
a9a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
a9b0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
a9c0: 73 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  size>=4 );   /* 
a9d0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
a9e0: 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66 28  e is 4 */..  if(
a9f0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73   pPage->pBt->bts
aa00: 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
aa10: 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
aa20: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
aa30: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
aa40: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
aa50: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
aa60: 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f  ete.    ** optio
aa70: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
aa80: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
aa90: 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  [start], 0, size
aaa0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
aab0: 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20   the space back 
aac0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
aad0: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
aae0: 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  ks.  Note that. 
aaf0: 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
ab00: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69  the freeblock li
ab10: 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62  st was checked b
ab20: 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  y btreeInitPage(
ab30: 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e 69  ),.  ** btreeIni
ab40: 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20  tPage() did not 
ab50: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69  detect overlappi
ab60: 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a  ng cells or.  **
ab70: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
ab80: 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c   overlapped cell
ab90: 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74  s.   Nor does it
aba0: 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65   detect when the
abb0: 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65  .  ** cell conte
abc0: 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20  nt area exceeds 
abd0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
abe0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49   page header.  I
abf0: 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74  f these.  ** sit
ac00: 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74  uations arise, t
ac10: 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69  hen subsequent i
ac20: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
ac30: 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20   might corrupt. 
ac40: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
ac50: 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64  .  So we do need
ac60: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f   to check for co
ac70: 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73  rruption while s
ac80: 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65  canning.  ** the
ac90: 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
aca0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
acb0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
acc0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c   = hdr + 1;.  iL
acd0: 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ast = pPage->pBt
ace0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
acf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
ad00: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68  t<=iLast );.  wh
ad10: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
ad20: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
ad30: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
ad40: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69  begin>0 ){.    i
ad50: 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34  f( pbegin<addr+4
ad60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ad70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ad80: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
ad90: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
ada0: 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e   }.  if( pbegin>
adb0: 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74  iLast ){.    ret
adc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
add0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
ade0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
adf0: 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20  dr || pbegin==0 
ae00: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
ae10: 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74  ata[addr], start
ae20: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
ae30: 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67  ata[start], pbeg
ae40: 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  in);.  put2byte(
ae50: 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20  &data[start+2], 
ae60: 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  size);.  pPage->
ae70: 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e  nFree = pPage->n
ae80: 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65  Free + (u16)size
ae90: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
aea0: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
aeb0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
aec0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
aed0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
aee0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
aef0: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
af00: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20  t pnext, psize, 
af10: 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
af20: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
af30: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
af40: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
af50: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
af60: 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d  4 );.    pnext =
af70: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
af80: 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73  pbegin]);.    ps
af90: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
afa0: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
afb0: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20  .    if( pbegin 
afc0: 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70  + psize + 3 >= p
afd0: 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20  next && pnext>0 
afe0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61  ){.      int fra
aff0: 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65  g = pnext - (pbe
b000: 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20  gin+psize);.    
b010: 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c    if( (frag<0) |
b020: 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74  | (frag>(int)dat
b030: 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20  a[hdr+7]) ){.   
b040: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b050: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
b070: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75  ata[hdr+7] -= (u
b080: 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20  8)frag;.      x 
b090: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b0a0: 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20  [pnext]);.      
b0b0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
b0c0: 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20  begin], x);.    
b0d0: 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65    x = pnext + ge
b0e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
b0f0: 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b  xt+2]) - pbegin;
b100: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
b110: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
b120: 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   x);.    }else{.
b130: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65        addr = pbe
b140: 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  gin;.    }.  }..
b150: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
b160: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65   content area be
b170: 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65  gins with a free
b180: 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74  block, remove it
b190: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b  . */.  if( data[
b1a0: 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+1]==data[hdr
b1b0: 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b  +5] && data[hdr+
b1c0: 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20  2]==data[hdr+6] 
b1d0: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a  ){.    int top;.
b1e0: 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74      pbegin = get
b1f0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b200: 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1]);.    memcpy(
b210: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64  &data[hdr+1], &d
b220: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b  ata[pbegin], 2);
b230: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
b240: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b250: 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  ) + get2byte(&da
b260: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
b270: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
b280: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
b290: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
b2a0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b2b0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b2c0: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
b2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b2e0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
b2f0: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
b300: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
b310: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
b320: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
b330: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
b340: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
b350: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
b360: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
b370: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
b380: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
b390: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
b3a0: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
b3b0: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
b3c0: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
b3d0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
b3e0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
b3f0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
b400: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
b410: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
b420: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
b430: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
b440: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
b450: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
b460: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
b470: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
b480: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
b490: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
b4a0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b4b0: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
b4c0: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
b4d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b4e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
b4f0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
b500: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
b510: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b520: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b530: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b540: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
b550: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
b560: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
b570: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
b580: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
b590: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
b5a0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
b5b0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
b5c0: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
b5d0: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
b5e0: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
b5f0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
b600: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
b610: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
b620: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
b630: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
b640: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b650: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
b660: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
b670: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
b680: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
b690: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
b6a0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
b6b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
b6c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
b6d0: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
b6e0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
b6f0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
b700: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
b710: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
b720: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
b730: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b740: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
b750: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  .  pPage->max1by
b760: 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d  tePayload = pBt-
b770: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
b780: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
b790: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
b7a0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
b7b0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
b7c0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
b7d0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
b7e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
b7f0: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
b800: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
b810: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
b820: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
b830: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
b840: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
b850: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
b860: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
b870: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
b880: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
b890: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
b8a0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
b8b0: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
b8c0: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
b8d0: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
b8e0: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
b8f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b900: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d   btreeInitPage(M
b910: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
b920: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b930: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b940: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b950: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b960: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b970: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b980: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
b990: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
b9a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b9b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
b9c0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b9d0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
b9e0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b9f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
ba00: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
ba10: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
ba20: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
ba30: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
ba40: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ba60: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
ba70: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
ba80: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
ba90: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
baa0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
bab0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
bac0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
bad0: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
bae0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
baf0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
bb00: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
bb10: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
bb20: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
bb30: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69  ructure */.    i
bb40: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
bb50: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
bb60: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
bb70: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
bb80: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
bb90: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
bba0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
bbb0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
bbc0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  inter */.    int
bbd0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
bbe0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
bbf0: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
bc00: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
bc10: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
bc20: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
bc30: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
bc40: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
bc50: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
bc60: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
bc70: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
bc80: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
bc90: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
bca0: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
bcb0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
bcc0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
bcd0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
bce0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
bcf0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
bd00: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
bd10: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
bd20: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
bd30: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
bd40: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
bd50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bd60: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
bd70: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
bd80: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
bd90: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
bda0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
bdb0: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
bdc0: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
bdd0: 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
bde0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61  low = 0;.    usa
bdf0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
be00: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70  sableSize;.    p
be10: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
be20: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
be30: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
be40: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
be50: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
be60: 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
be70: 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43  ];.    pPage->aC
be80: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
be90: 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ellOffset];.    
bea0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
beb0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
bec0: 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  5]);.    pPage->
bed0: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
bee0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
bef0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
bf00: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
bf10: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
bf20: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
bf30: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
bf40: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
bf50: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
bf60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bf70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bf80: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
bf90: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
bfa0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
bfb0: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
bfc0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
bfd0: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
bfe0: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
bff0: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
c000: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
c010: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
c020: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
c030: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
c040: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
c050: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
c060: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
c070: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
c080: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
c090: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
c0a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
c0b0: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
c0c0: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
c0d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
c0e0: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
c0f0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
c100: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
c110: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
c120: 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  - 4;.#if defined
c130: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
c140: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
c150: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
c160: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c170: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
c180: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
c190: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
c1a0: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
c1b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
c1c0: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
c1d0: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
c1e0: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
c1f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c200: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
c210: 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
c220: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
c230: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
c240: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
c250: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
c260: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
c270: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
c280: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
c290: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c2a0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c2b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
c2c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c2d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
c2e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
c2f0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
c300: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
c310: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
c320: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
c330: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
c340: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
c350: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
c360: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c370: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
c380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c390: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
c3a0: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
c3b0: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65  st++;.    }  .#e
c3c0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ndif..    /* Com
c3d0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
c3e0: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
c3f0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
c400: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c410: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
c420: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
c430: 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69  ] + top;.    whi
c440: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
c450: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
c460: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
c470: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c480: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c490: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
c4a0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   free block is o
c4b0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
c4c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c4d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c4e0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
c4f0: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
c500: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
c510: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
c520: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
c530: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78  ;.      if( (nex
c540: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
c550: 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69  size+3) || pc+si
c560: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
c570: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
c580: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
c590: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
c5a0: 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74  er. And the last
c5b0: 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20   byte of.       
c5c0: 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f   ** the free-blo
c5d0: 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74  ck must lie on t
c5e0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
c5f0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
c600: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c610: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
c620: 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d   }.      nFree =
c630: 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
c640: 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
c650: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
c660: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72   this point, nFr
c670: 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ee contains the 
c680: 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65  sum of the offse
c690: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
c6a0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c     ** of the cel
c6b0: 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70  l-content area p
c6c0: 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lus the number o
c6d0: 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74  f free bytes wit
c6e0: 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  hin.    ** the c
c6f0: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
c700: 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65  . If this is gre
c710: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73  ater than the us
c720: 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a  able-size.    **
c730: 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68   of the page, th
c740: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74  en the page must
c750: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54   be corrupted. T
c760: 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20  his check also. 
c770: 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20     ** serves to 
c780: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
c790: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c7a0: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
c7b0: 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61  content.    ** a
c7c0: 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
c7d0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
c7e0: 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
c7f0: 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  he page..    */.
c800: 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73      if( nFree>us
c810: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c820: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c830: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
c840: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
c850: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46  nFree = (u16)(nF
c860: 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74  ree - iCellFirst
c870: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
c880: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Init = 1;.  }.  
c890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c8a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
c8b0: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
c8c0: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
c8d0: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
c8e0: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
c8f0: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
c900: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
c910: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c920: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
c930: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
c940: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
c950: 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
c960: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
c970: 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61  ;.  u8 hdr = pPa
c980: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
c990: 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61   u16 first;..  a
c9a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
c9b0: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
c9c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
c9d0: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
c9e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c9f0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
ca00: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
ca10: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
ca20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ca30: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
ca40: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
ca50: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
ca60: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
ca70: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
ca80: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
ca90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
caa0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cab0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
cac0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
cad0: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
cae0: 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
caf0: 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
cb00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
cb10: 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74   hdr);.  }.  dat
cb20: 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
cb30: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
cb40: 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54  hdr + ((flags&PT
cb50: 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20  F_LEAF)==0 ? 12 
cb60: 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  : 8);.  memset(&
cb70: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
cb80: 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
cb90: 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
cba0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
cbb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
cbc0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
cbd0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
cbe0: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
cbf0: 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  );.  decodeFlags
cc00: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
cc10: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
cc20: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
cc30: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
cc40: 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62   &data[pBt->usab
cc50: 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
cc60: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
cc70: 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61  ta[first];.  pPa
cc80: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
cc90: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
cca0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
ccb0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
ccc0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
ccd0: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
cce0: 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
ccf0: 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
cd00: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
cd10: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
cd20: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
cd30: 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
cd40: 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
cd50: 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
cd60: 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
cd70: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
cd80: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
cd90: 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
cda0: 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
cdb0: 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
cdc0: 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
cdd0: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
cde0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
cdf0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
ce00: 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
ce10: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
ce20: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
ce30: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
ce40: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
ce50: 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
ce60: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
ce70: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
ce80: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
ce90: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
cea0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
ceb0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
cec0: 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
ced0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cee0: 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
cef0: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
cf00: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
cf10: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
cf20: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  s if needed..**.
cf30: 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74  ** If the noCont
cf40: 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ent flag is set,
cf50: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
cf60: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
cf70: 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
cf80: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
cf90: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
cfa0: 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
cfb0: 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
cfc0: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
cfd0: 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
cfe0: 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
cff0: 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
d000: 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
d010: 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
d020: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
d030: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
d040: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
d050: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
d060: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
d070: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
d080: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
d090: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
d0a0: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
d0b0: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
d0c0: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
d0d0: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
d0e0: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
d0f0: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
d100: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d110: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
d120: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
d130: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
d140: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
d150: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
d160: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
d170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
d180: 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
d190: 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
d1a0: 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
d1b0: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
d1c0: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
d1d0: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
d1e0: 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
d1f0: 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20  ET_NOCONTENT || 
d200: 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
d210: 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61  _READONLY );.  a
d220: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d230: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d240: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
d250: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
d260: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
d270: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
d280: 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
d290: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
d2a0: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
d2b0: 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
d2c0: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
d2d0: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
d2e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d2f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
d300: 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
d310: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
d320: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
d330: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
d340: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
d350: 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
d360: 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
d370: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
d380: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
d390: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
d3a0: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
d3b0: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
d3c0: 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
d3d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
d3e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
d3f0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
d400: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d410: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d420: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
d430: 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
d440: 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
d450: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
d460: 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
d470: 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
d480: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
d490: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
d4a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
d4b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
d4c0: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
d4d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d4e0: 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
d4f0: 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
d500: 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
d510: 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
d520: 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
d530: 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
d540: 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
d550: 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
d560: 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
d570: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
d580: 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
d590: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d5a0: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
d5b0: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
d5c0: 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
d5d0: 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
d5e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
d5f0: 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
d600: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
d610: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
d620: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
d630: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
d640: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
d650: 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65  a.** convenience
d660: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
d670: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
d680: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  o btreeGetPage()
d690: 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e   and .** btreeIn
d6a0: 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
d6b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d6c0: 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  rs, then the val
d6d0: 75 65 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ue *ppPage is se
d6e0: 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69 6e 65  t to is undefine
d6f0: 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d  d. It.** may rem
d700: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f  ain unchanged, o
d710: 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20  r it may be set 
d720: 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61  to an invalid va
d730: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
d740: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
d750: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
d760: 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
d770: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
d780: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
d790: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d7b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
d7c0: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
d7d0: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
d7e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
d7f0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
d800: 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
d810: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 6f 6e  */.  int bReadon
d820: 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ly              
d830: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
d840: 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72 20 30 20  T_READONLY or 0 
d850: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
d860: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d870: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d880: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
d890: 73 65 72 74 28 20 62 52 65 61 64 6f 6e 6c 79 3d  sert( bReadonly=
d8a0: 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
d8b0: 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f 6e 6c 79  NLY || bReadonly
d8c0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  ==0 );..  if( pg
d8d0: 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
d8e0: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63  t(pBt) ){.    rc
d8f0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
d900: 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
d910: 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
d920: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
d930: 2c 20 70 70 50 61 67 65 2c 20 62 52 65 61 64 6f  , ppPage, bReado
d940: 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nly);.    if( rc
d950: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
d960: 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
d970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
d980: 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
d990: 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
d9a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d9b0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
d9c0: 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
d9d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d9e0: 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65  .  }..  testcase
d9f0: 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
da00: 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
da10: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
da20: 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
da30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
da40: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
da50: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
da60: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
da70: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
da80: 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
da90: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
daa0: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
dab0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
dac0: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
dad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
dae0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
daf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
db00: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
db10: 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
db20: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
db30: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
db40: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
db50: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
db60: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61  *)pPage );.    a
db70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
db80: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
db90: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
dba0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
dbb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
dbc0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
dbd0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
dbe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
dbf0: 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
dc00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
dc10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
dc20: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
dc30: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
dc40: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
dc50: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
dc60: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
dc70: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
dc80: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
dc90: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
dca0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
dcb0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
dcc0: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
dcd0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
dce0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
dcf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
dd00: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
dd10: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
dd20: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
dd30: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
dd40: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
dd50: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
dd60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
dd70: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
dd80: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
dd90: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
dda0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
ddb0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
ddc0: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
ddd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
dde0: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
ddf0: 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
de00: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
de10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
de20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
de30: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
de40: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
de50: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
de60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
de70: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
de80: 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
de90: 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
dea0: 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
deb0: 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
dec0: 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
ded0: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
dee0: 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
def0: 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
df00: 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
df10: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
df20: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
df30: 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
df40: 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
df50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
df60: 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
df70: 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
df80: 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
df90: 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
dfa0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
dfb0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
dfc0: 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
dfd0: 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
dfe0: 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
dff0: 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
e000: 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
e010: 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
e020: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
e030: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
e040: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
e050: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
e060: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
e070: 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
e080: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
e090: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
e0a0: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
e0b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
e0c0: 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
e0d0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
e0e0: 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
e0f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e100: 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
e110: 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
e120: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
e130: 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
e140: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
e150: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
e160: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
e170: 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
e180: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
e190: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e1a0: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
e1b0: 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
e1c0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
e1d0: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
e1e0: 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
e1f0: 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
e200: 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
e210: 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
e220: 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
e230: 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
e240: 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
e250: 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
e260: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
e270: 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
e280: 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
e290: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
e2a0: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
e2b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
e2c0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
e2d0: 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
e2e0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
e2f0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
e300: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
e310: 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
e320: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
e330: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
e340: 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
e350: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
e360: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
e370: 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
e380: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
e390: 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
e3a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
e3b0: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
e3c0: 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
e3d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
e3e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
e3f0: 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
e400: 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
e410: 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
e420: 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
e430: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
e440: 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
e450: 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
e460: 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
e470: 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
e480: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e490: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
e4a0: 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
e4b0: 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
e4c0: 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
e4d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
e4e0: 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
e4f0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
e500: 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
e510: 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
e520: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
e530: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
e540: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
e550: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
e560: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
e570: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e580: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
e590: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
e5a0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
e5b0: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
e5c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
e5d0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
e5e0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
e5f0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
e600: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
e610: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
e620: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
e630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
e640: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
e650: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
e660: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
e670: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e680: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e690: 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
e6a0: 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
e6b0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
e6e0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
e6f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
e700: 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
e710: 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
e720: 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
e730: 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
e740: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e760: 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
e770: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
e780: 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
e7b0: 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
e7c0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
e7d0: 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
e7e0: 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
e7f0: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
e800: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
e810: 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
e820: 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
e830: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
e840: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
e850: 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
e860: 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
e870: 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
e880: 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
e890: 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
e8a0: 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
e8b0: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
e8c0: 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
e8d0: 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
e8e0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
e8f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e900: 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
e910: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
e920: 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
e930: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
e940: 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
e950: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
e960: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
e990: 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
e9a0: 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
e9d0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
e9e0: 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
e9f0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
ea00: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ea10: 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
ea20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
ea30: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
ea40: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
ea50: 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
ea60: 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
ea70: 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
ea80: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
ea90: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
eaa0: 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
eab0: 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
eac0: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
ead0: 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
eae0: 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
eaf0: 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
eb00: 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
eb10: 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
eb20: 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
eb30: 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
eb40: 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
eb50: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
eb60: 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
eb70: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
eb80: 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
eb90: 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
eba0: 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
ebb0: 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
ebc0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
ebd0: 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
ebe0: 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
ebf0: 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
ec00: 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
ec10: 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
ec20: 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
ec30: 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
ec40: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
ec50: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
ec60: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
ec70: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
ec80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
ec90: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
eca0: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
ecb0: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
ecc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ecd0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ece0: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
ecf0: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
ed00: 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
ed10: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
ed20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
ed30: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
ed40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ed50: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
ed60: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
ed70: 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
ed80: 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
ed90: 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
eda0: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
edb0: 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
edc0: 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
edd0: 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
ede0: 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
edf0: 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
ee00: 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
ee10: 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
ee20: 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
ee30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
ee40: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
ee50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
ee60: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
ee70: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
ee80: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
ee90: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
eea0: 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  te3Malloc(nFullP
eeb0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
eec0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
eed0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
eee0: 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
eef0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
ef00: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
ef10: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
ef20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ef30: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
ef40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ef50: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
ef60: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
ef70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
ef80: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
ef90: 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Filename, sqlite
efa0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
efb0: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 7d  ame)+1);.      }
efc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
efd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
efe0: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
eff0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
f020: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
f030: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
f040: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f060: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
f070: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
f080: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
f090: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f0a0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
f0b0: 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
f0c0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
f0d0: 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
f0e0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
f0f0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
f100: 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
f110: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f120: 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
f130: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
f140: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
f150: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f160: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
f170: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
f180: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
f190: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
f1a0: 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
f1b0: 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
f1c0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
f1d0: 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
f1e0: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
f1f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f200: 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
f210: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
f220: 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
f230: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
f240: 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
f250: 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
f270: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
f280: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
f290: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
f2a0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
f2b0: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
f2c0: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
f2d0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
f2e0: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
f2f0: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
f300: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
f310: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
f320: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
f330: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
f340: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f350: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f360: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f370: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f380: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f390: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
f3a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
f3b0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
f3c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
f3d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f3e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f3f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f400: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
f410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f420: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
f430: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
f440: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
f450: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
f460: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
f470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f480: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f490: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f4b0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
f4c0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
f4d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
f4e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
f4f0: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
f500: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
f510: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
f520: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
f530: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
f540: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
f550: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
f560: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
f570: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
f580: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
f590: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
f5a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f5b0: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
f5c0: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
f5d0: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
f5e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f5f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
f600: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f610: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
f620: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
f630: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
f640: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
f650: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
f660: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
f670: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
f680: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
f690: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
f6a0: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
f6b0: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
f6c0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
f6d0: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
f6e0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
f6f0: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
f700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f710: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
f720: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
f730: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f740: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
f750: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
f760: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f770: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
f780: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
f790: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
f7a0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f7b0: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
f7c0: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
f7d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
f7e0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
f7f0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
f800: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f810: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
f820: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
f840: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
f850: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
f860: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
f870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f880: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
f890: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
f8a0: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
f8b0: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
f8c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f8d0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f8e0: 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
f8f0: 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
f900: 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
f910: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
f920: 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
f930: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
f940: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
f950: 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
f960: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f970: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
f980: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f990: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
f9a0: 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
f9b0: 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
f9c0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
f9d0: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
f9e0: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
f9f0: 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
fa00: 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
fa10: 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
fa20: 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
fa30: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
fa40: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
fa50: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fa60: 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
fa70: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
fa80: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
fa90: 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
faa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
fab0: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
fac0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
fad0: 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
fae0: 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ETE;.#endif.    
faf0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
fb00: 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c  (zDbHeader[16]<<
fb10: 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b  8) | (zDbHeader[
fb20: 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
fb30: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
fb40: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
fb50: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
fb60: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
fb70: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
fb80: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
fb90: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
fba0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
fbb0: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
fbc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
fbd0: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
fbe0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
fbf0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
fc00: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
fc10: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
fc20: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
fc30: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
fc40: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
fc50: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
fc60: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
fc70: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
fc80: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
fc90: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
fca0: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
fcb0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
fcc0: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
fcd0: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
fce0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
fcf0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
fd00: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
fd10: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
fd20: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
fd30: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
fd40: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
fd50: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
fd60: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
fd70: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
fd80: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
fd90: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
fda0: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
fdb0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
fdc0: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
fdd0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
fde0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
fdf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
fe00: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
fe10: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
fe20: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
fe30: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
fe40: 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
fe50: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
fe60: 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
fe70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fe80: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
fe90: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
fea0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
feb0: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
fec0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
fed0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
fee0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
fef0: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
ff00: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
ff10: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
ff20: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
ff30: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
ff40: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
ff50: 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
ff60: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
ff70: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
ff80: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
ff90: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
ffa0: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
ffb0: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
ffc0: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
ffd0: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
ffe0: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
fff0: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
10000 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10010 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
10020 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
10030 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
10040 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
10050 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
10060 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
10070 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
10080 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
10090 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
100a0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
100b0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
100c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
100d0 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
100e0 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
100f0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
10100 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
10110 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10120 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10130 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
10140 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
10150 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
10160 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
10170 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
10180 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
10190 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
101a0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
101b0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
101c0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
101d0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
101e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
101f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
10200 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
10210 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
10220 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
10230 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
10240 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10250 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10260 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
10270 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
10280 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
10290 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
102a0 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
102b0 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
102c0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
102d0 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
102e0 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
102f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
10300 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
10310 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
10320 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10330 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10340 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
10350 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
10360 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
10370 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
10380 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
10390 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
103a0 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
103b0 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
103c0 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
103d0 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
103e0 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
103f0 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
10400 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
10410 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
10420 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
10430 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
10440 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
10450 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
10460 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10470 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
10480 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
10490 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
104a0 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
104b0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
104c0 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
104d0 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
104e0 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
104f0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
10500 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
10510 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
10520 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
10530 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
10540 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
10550 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
10560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10570 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
10580 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
10590 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
105a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
105b0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
105c0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
105d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
105e0 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
105f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
10600 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
10610 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
10620 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
10630 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
10640 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
10650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10660 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
10670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10680 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10690 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
106a0 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
106b0 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
106c0 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
106d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
106e0 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
106f0 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
10700 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
10710 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10720 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
10730 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
10740 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
10750 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
10760 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10770 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
10780 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
10790 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
107a0 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
107b0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
107c0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
107d0 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
107e0 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
107f0 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
10800 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
10810 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
10820 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
10830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10840 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
10850 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
10860 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10870 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
10880 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
10890 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
108a0 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
108b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
108c0 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
108d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
108e0 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
108f0 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
10900 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10910 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
10920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10930 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
10940 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
10950 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
10960 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
10970 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
10980 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
10990 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
109a0 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
109b0 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
109c0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
109d0 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
109e0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
109f0 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
10a00 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
10a10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
10a20 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
10a30 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
10a40 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
10a50 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10a60 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
10a70 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
10a80 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
10a90 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
10aa0 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
10ab0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
10ac0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
10ad0 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
10ae0 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
10af0 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
10b00 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10b10 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10b20 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
10b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10b40 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
10b50 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
10b60 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
10b70 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
10b80 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10b90 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10ba0 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
10bb0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
10bc0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10bd0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
10be0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
10bf0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
10c00 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
10c10 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10c20 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
10c30 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
10c40 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
10c50 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
10c60 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
10c70 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10c80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10c90 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10ca0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10cb0 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10cd0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10ce0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
10cf0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10d00 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
10d10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
10d20 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
10d30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10d40 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
10d50 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
10d60 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
10d70 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10d80 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10d90 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10da0 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10db0 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10dc0 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
10dd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10de0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
10df0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
10e00 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
10e10 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
10e20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
10e30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
10e40 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
10e50 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
10e60 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
10e70 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
10e80 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
10e90 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
10ea0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
10eb0 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
10ec0 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
10ed0 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
10ee0 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
10ef0 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
10f00 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
10f10 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
10f20 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
10f30 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
10f40 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
10f50 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
10f60 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
10f70 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
10f80 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
10f90 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
10fa0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
10fb0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
10fc0 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
10fd0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
10fe0 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
10ff0 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
11000 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
11010 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
11020 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
11030 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
11040 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
11050 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
11060 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
11070 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
11080 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
11090 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
110a0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
110b0 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
110c0 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
110d0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
110e0 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
110f0 61 63 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  ace here.  */.  
11100 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
11110 70 61 63 65 20 29 20 6d 65 6d 73 65 74 28 70 42  pace ) memset(pB
11120 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c  t->pTmpSpace, 0,
11130 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   4);.  }.}../*.*
11140 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
11150 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
11160 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
11170 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
11180 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
11190 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
111a0 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
111b0 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
111c0 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
111d0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
111e0 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
111f0 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
11200 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
11210 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
11220 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
11230 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
11240 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
11250 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
11260 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
11270 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
11280 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
11290 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
112a0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
112b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
112c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
112d0 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
112e0 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
112f0 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
11300 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
11310 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
11320 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
11330 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
11340 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
11350 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
11360 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
11370 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
11380 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
11390 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
113a0 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
113b0 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
113c0 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
113d0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
113e0 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
113f0 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
11400 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
11410 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
11420 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
11430 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  p, SQLITE_OK);. 
11440 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11450 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
11460 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
11470 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
11480 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
11490 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
114a0 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
114b0 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
114c0 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
114d0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
114e0 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
114f0 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
11500 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
11510 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
11520 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
11530 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
11540 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
11550 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
11560 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
11570 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
11580 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
11590 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
115a0 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
115b0 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
115c0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
115d0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
115e0 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
115f0 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
11600 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
11610 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
11620 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
11630 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
11640 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
11650 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
11660 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
11670 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
11680 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
11690 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
116a0 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
116b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
116c0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a   pBt->pSchema);.
116d0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
116e0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
116f0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
11700 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
11710 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
11720 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
11730 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
11740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
11750 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
11760 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
11770 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
11780 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
11790 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
117a0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
117b0 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
117c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
117d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
117e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
117f0 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
11800 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
11810 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
11820 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
11830 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
11840 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
11850 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
11860 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
11870 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
11880 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
11890 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
118a0 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
118b0 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
118c0 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
118d0 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
118e0 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
118f0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
11900 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
11910 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
11920 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
11930 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
11940 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
11950 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
11960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
11970 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
11980 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
11990 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
119a0 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
119b0 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
119c0 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
119d0 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
119e0 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
119f0 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
11a00 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
11a10 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
11a20 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
11a30 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
11a40 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
11a50 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
11a60 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
11a70 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
11a80 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
11a90 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
11aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11ab0 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
11ac0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
11ad0 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
11ae0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11af0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11b00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
11b10 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
11b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11b30 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
11b40 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
11b50 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
11b60 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
11b70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11b80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11b90 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
11ba0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
11bb0 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  0./*.** Change t
11bc0 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
11bd0 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61  amount of the da
11be0 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
11bf0 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72   may be.** memor
11c00 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74  y mapped..*/.int
11c10 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11c20 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20  MmapLimit(Btree 
11c30 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
11c40 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53  4 szMmap){.  BtS
11c50 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11c60 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
11c70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11c80 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11c90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11ca0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
11cb0 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
11cc0 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
11cd0 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71  r, szMmap);.  sq
11ce0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11cf0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11d00 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11d10 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
11d20 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
11d30 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
11d40 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
11d50 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
11d60 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
11d70 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
11d80 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
11d90 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
11da0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
11db0 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
11dc0 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
11dd0 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
11de0 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
11df0 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
11e00 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
11e10 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
11e20 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
11e30 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
11e40 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
11e50 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
11e60 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
11e70 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
11e80 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
11e90 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
11ea0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
11eb0 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
11ec0 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
11ed0 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
11ee0 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
11ef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11f00 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
11f10 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
11f20 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20  etPagerFlags(.  
11f30 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
11f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
11f50 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73  ree to set the s
11f60 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a  afety level on *
11f70 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
11f80 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61  lags       /* Va
11f90 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c  rious PAGER_* fl
11fa0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ags */.){.  BtSh
11fb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11fc0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
11fd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11fe0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
11ff0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12000 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
12010 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
12020 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
12030 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  Flags);.  sqlite
12040 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12060 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
12070 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
12080 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72  if the given btr
12090 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66  ee is set to saf
120a0 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e  ety level 1.  In
120b0 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
120c0 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
120d0 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73  no sync() occurs
120e0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
120f0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
12100 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
12110 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  led(Btree *p){. 
12120 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12130 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
12140 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
12150 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12160 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
12170 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65    .  sqlite3Btre
12180 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
12190 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
121a0 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20  >pPager );.  rc 
121b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  = sqlite3PagerNo
121c0 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72  sync(pBt->pPager
121d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
121e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
121f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12200 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
12210 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
12220 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
12230 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
12240 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
12250 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
12260 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
12270 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
12280 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12290 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
122a0 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
122b0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
122c0 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
122d0 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
122e0 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
122f0 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
12300 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
12310 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
12320 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
12330 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
12340 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
12350 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
12360 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
12370 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
12380 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
12390 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
123a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
123b0 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
123c0 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
123d0 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
123e0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
123f0 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
12400 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
12410 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
12420 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
12430 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
12440 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
12450 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
12460 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
12470 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
12480 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
12490 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
124a0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
124b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
124c0 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
124d0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
124e0 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
124f0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
12500 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
12510 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
12520 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
12530 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
12540 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
12550 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
12560 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
12570 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
12580 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
12590 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
125a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
125b0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
125c0 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
125d0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
125e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
125f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
12600 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
12610 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
12620 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
12630 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12650 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
12660 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
12670 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
12680 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
12690 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
126a0 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
126b0 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
126c0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
126d0 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
126e0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
126f0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
12700 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
12710 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
12720 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
12730 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
12740 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
12750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
12760 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70  Bt->pPage1 && !p
12770 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
12780 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
12790 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
127a0 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
127b0 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
127c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
127d0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
127e0 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
127f0 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
12800 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
12810 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
12820 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
12830 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
12840 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
12850 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
12860 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
12870 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12880 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12890 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
128a0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
128b0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
128c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
128d0 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
128e0 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
128f0 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
12900 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  ze;.}..#if defin
12910 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
12920 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  DEC) || defined(
12930 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
12940 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12950 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
12960 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
12970 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74  eserve(), except
12980 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20   that it.** may 
12990 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69  only be called i
129a0 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  f it is guarante
129b0 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72  ed that the b-tr
129c0 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65  ee mutex is alre
129d0 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a  ady.** held..**.
129e0 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75  ** This is usefu
129f0 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c  l in one special
12a00 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63   case in the bac
12a10 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65  kup API code whe
12a20 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77  re it is.** know
12a30 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65  n that the share
12a40 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
12a50 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20  s held, but the 
12a60 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a  mutex on the .**
12a70 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12a80 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73   that owns *p is
12a90 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61   not. In this ca
12aa0 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72  se if sqlite3Btr
12ab0 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72  eeEnter().** wer
12ac0 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20  e to be called, 
12ad0 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65  it might collide
12ae0 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72   with some other
12af0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
12b00 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
12b10 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12b20 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66  p, causing undef
12b30 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a  ined behavior..*
12b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12b50 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
12b60 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tex(Btree *p){. 
12b70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12b80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
12b90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12ba0 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
12bb0 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
12bc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a  ->usableSize;.}.
12bd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12be0 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51  _HAS_CODEC || SQ
12bf0 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23  LITE_DEBUG */..#
12c00 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12c10 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
12c20 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
12c30 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12c40 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74  ACUUM)./*.** Ret
12c50 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
12c60 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
12c70 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
12c80 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a  very page that.*
12c90 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c  * are intentuall
12ca0 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20  y left unused.  
12cb0 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73  This is the "res
12cc0 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61  erved" space tha
12cd0 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65  t is.** sometime
12ce0 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73  s used by extens
12cf0 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
12d00 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
12d10 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
12d20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
12d30 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12d40 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
12d50 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
12d60 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73  >usableSize;.  s
12d70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12d80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
12d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
12da0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
12db0 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
12dc0 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
12dd0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
12de0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
12df0 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
12e00 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
12e10 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
12e20 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
12e30 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
12e40 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
12e50 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
12e60 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
12e70 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
12e80 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
12e90 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
12ea0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
12eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
12ec0 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
12ed0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
12ee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12ef0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12f00 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
12f10 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55  Set the BTS_SECU
12f20 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69  RE_DELETE flag i
12f30 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
12f40 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
12f50 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
12f60 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
12f70 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
12f80 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12f90 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
12fa0 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66  TE.** setting af
12fb0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a  ter the change..
12fc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12fd0 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
12fe0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
12ff0 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
13000 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
13010 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
13020 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13030 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
13040 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
13050 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
13060 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
13070 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20      if( newFlag 
13080 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  ) p->pBt->btsFla
13090 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
130a0 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20  _DELETE;.  } .  
130b0 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73  b = (p->pBt->bts
130c0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
130d0 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20  RE_DELETE)!=0;. 
130e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
130f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13100 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  b;.}.#endif /* !
13110 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13120 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
13130 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
13140 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
13150 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
13160 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
13170 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
13180 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
13190 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
131a0 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
131b0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
131c0 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
131d0 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
131e0 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
131f0 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
13200 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
13210 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
13220 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
13230 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
13240 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
13250 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
13260 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
13270 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
13280 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
13290 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
132a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
132b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
132c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
132d0 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
132e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
132f0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
13300 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13310 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
13320 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
13330 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
13340 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
13350 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
13360 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
13370 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
13380 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
13390 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
133a0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
133b0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
133c0 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
133d0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
133e0 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
133f0 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
13400 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13410 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
13420 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
13430 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
13440 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
13450 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
13460 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
13470 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
13480 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
13490 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
134a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
134b0 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
134c0 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
134d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
134e0 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
134f0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
13500 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
13510 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13520 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
13530 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
13540 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
13550 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
13560 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
13570 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
13580 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
13590 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
135a0 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
135b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
135c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
135d0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
135e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
135f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
13600 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
13610 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
13620 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
13630 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
13640 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
13650 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
13660 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
13670 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
13680 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
13690 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
136a0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
136b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
136c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
136d0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
136e0 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
136f0 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
13700 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
13710 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
13720 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
13730 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
13740 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
13750 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
13760 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
13770 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
13780 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
13790 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d  nctions */.  Mem
137a0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
137b0 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74    /* Page 1 of t
137c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
137d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
137e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
137f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
13800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
13810 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65  .  int nPageFile
13820 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
13830 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
13840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13850 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65  */.  int nPageHe
13860 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ader;     /* Num
13870 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
13880 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63  the database acc
13890 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f  ording to hdr */
138a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
138b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
138c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
138d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
138e0 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
138f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
13900 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
13910 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
13920 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
13930 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
13940 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
13950 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
13960 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13970 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
13980 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
13990 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
139a0 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
139b0 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
139c0 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
139d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
139e0 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
139f0 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65  nPageHeader = ge
13a00 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
13a10 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
13a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
13a30 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
13a40 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b  er, &nPageFile);
13a50 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
13a60 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38  || memcmp(24+(u8
13a70 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
13a80 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d   92+(u8*)pPage1-
13a90 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a  >aData,4)!=0 ){.
13aa0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
13ab0 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eFile;.  }.  if(
13ac0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
13ad0 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
13ae0 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
13af0 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
13b00 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
13b10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13b20 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28  _NOTADB;.    if(
13b30 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
13b40 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
13b50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
13b60 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13b70 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
13b80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
13b90 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
13ba0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
13bb0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13bc0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
13bd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
13be0 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
13bf0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13c00 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13c10 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
13c20 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
13c30 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
13c40 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
13c50 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
13c60 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
13c70 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
13c80 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
13c90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13ca0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
13cb0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
13cc0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
13cd0 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
13ce0 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
13cf0 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
13d00 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
13d10 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
13d20 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
13d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
13d40 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
13d50 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
13d60 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
13d70 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
13d80 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
13d90 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
13da0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
13db0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
13dc0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
13dd0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
13de0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
13df0 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
13e00 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
13e10 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
13e20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
13e30 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
13e40 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
13e50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
13e60 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
13e70 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
13e80 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
13e90 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
13ea0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
13eb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13ec0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
13ed0 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
13ee0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
13ef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13f00 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
13f10 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
13f20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
13f30 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
13f40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
13f50 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ge1);.        re
13f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
13f80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
13f90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
13fa0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
13fb0 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  um embedded frac
13fc0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61  tion must be exa
13fd0 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74  ctly 25%.  And t
13fe0 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  he minimum.    *
13ff0 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  * embedded fract
14000 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35  ion must be 12.5
14010 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d  % for both leaf-
14020 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61  data and non-lea
14030 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54  f-data..    ** T
14040 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
14050 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
14060 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
14070 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
14080 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
14090 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
140a0 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
140b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
140c0 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
140d0 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
140e0 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
140f0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
14100 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
14110 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
14120 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
14130 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
14140 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
14150 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
14160 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
14170 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
14180 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
14190 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
141a0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
141b0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
141c0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
141d0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
141e0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75  & 7)==0 );.    u
141f0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
14200 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
14210 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70  ;.    if( (u32)p
14220 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
14230 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
14240 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
14250 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
14260 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14270 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
14280 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
14290 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
142a0 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
142b0 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
142c0 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
142d0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
142e0 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
142f0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
14300 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
14310 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
14320 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
14330 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
14340 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
14350 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
14360 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
14370 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
14380 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
14390 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
143a0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
143b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
143c0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
143d0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
143e0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
143f0 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
14400 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
14410 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
14420 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
14430 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
14440 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69            pageSi
14470 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  ze-usableSize);.
14480 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14490 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
144a0 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
144b0 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79   SQLITE_Recovery
144c0 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67  Mode)==0 && nPag
144d0 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20  e>nPageFile ){. 
144e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
144f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14500 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
14510 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
14520 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
14530 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
14540 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
14550 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
14560 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
14570 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
14580 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
14590 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
145a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
145b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
145c0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
145d0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
145e0 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
145f0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
14600 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
14610 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
14620 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
14630 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
14640 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
14650 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
14660 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
14670 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
14680 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
14690 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
146a0 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
146b0 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
146c0 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
146d0 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
146e0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
146f0 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
14700 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
14710 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
14720 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
14730 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
14740 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
14750 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
14760 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
14770 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
14780 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
14790 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
147a0 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
147b0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
147c0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
147d0 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
147e0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
147f0 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
14800 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
14810 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
14820 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
14830 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
14840 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
14850 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
14860 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
14870 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
14880 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
14890 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
148a0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
148b0 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
148c0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
148d0 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
148e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
148f0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
14900 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
14910 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
14920 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
14930 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
14940 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
14950 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
14960 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
14970 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
14980 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
14990 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
149a0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
149b0 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
149c0 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
149d0 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
149e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
149f0 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
14a00 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
14a10 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
14a20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
14a30 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
14a40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a50 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
14a60 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
14a70 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
14a80 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
14a90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14aa0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
14ab0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
14ac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
14ad0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e  ors open on pBt.
14ae0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
14af0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
14b00 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
14b10 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
14b20 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
14b30 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
14b40 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  .**.** Only writ
14b50 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  e cursors are co
14b60 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20  unted if wrOnly 
14b70 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f  is true.  If wrO
14b80 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20  nly is.** false 
14b90 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73  then all cursors
14ba0 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a   are counted..**
14bb0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
14bc0 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
14bd0 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69  tine, a cursor i
14be0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
14bf0 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
14c00 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  of reading or wr
14c10 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
14c20 61 62 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  abse.  Cursors t
14c30 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
14c40 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
14c50 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
14c60 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
14c70 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
14c80 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
14c90 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
14ca0 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
14cb0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
14cc0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
14cd0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
14ce0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
14cf0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
14d00 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
14d10 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
14d20 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
14d30 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
14d40 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
14d50 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
14d60 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
14d70 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
14d80 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
14d90 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
14da0 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
14db0 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
14dc0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
14dd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
14de0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
14df0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
14e00 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
14e10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
14e20 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
14e30 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
14e40 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
14e50 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
14e60 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
14e70 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
14e80 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
14e90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
14ea0 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
14eb0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14ec0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
14ed0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
14ee0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
14ef0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
14f00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14f10 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
14f20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
14f30 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
14f40 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
14f50 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
14f60 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
14f70 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
14f80 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
14f90 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
14fa0 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
14fb0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
14fc0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
14fd0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
14fe0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
14ff0 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
15000 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
15010 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
15020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15030 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
15040 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
15050 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
15060 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
15070 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
15080 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
15090 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
150a0 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
150b0 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
150c0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
150d0 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
150e0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
150f0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
15100 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
15110 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
15120 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
15130 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
15140 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15150 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15160 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
15170 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
15180 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
15190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
151a0 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
151b0 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
151c0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
151d0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
151e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
151f0 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
15200 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
15210 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
15220 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
15230 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
15240 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
15250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
15260 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
15270 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
15280 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
15290 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
152a0 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
152b0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
152c0 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
152d0 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
152e0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
152f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
15300 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
15310 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
15320 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
15330 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
15340 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
15350 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
15360 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
15370 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
15380 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
15390 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
153a0 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
153b0 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
153c0 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
153d0 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
153e0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
153f0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
15400 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15410 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
15420 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
15430 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
15440 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
15450 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
15460 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
15470 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
15480 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
15490 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
154a0 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
154b0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
154c0 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
154d0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
154e0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
154f0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
15500 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
15510 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
15520 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
15530 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
15540 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15550 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
15560 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
15570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15580 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
15590 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
155a0 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
155b0 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
155c0 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
155d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
155e0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
155f0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
15600 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
15610 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
15620 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
15630 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
15640 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15650 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
15660 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
15670 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
15680 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
15690 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
156a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
156b0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
156c0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
156d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
156e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
156f0 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
15700 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
15710 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
15720 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
15730 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
15740 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
15750 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
15760 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
15770 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
15780 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
15790 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
157a0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
157b0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
157c0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
157d0 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
157e0 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
157f0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
15800 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
15810 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
15820 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
15830 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
15840 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
15850 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
15860 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
15870 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
15880 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
15890 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
158a0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
158b0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
158c0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
158d0 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
158e0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
158f0 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
15900 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
15910 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
15920 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
15930 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
15940 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
15950 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
15960 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
15970 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
15980 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
15990 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
159a0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
159b0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
159c0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
159d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
159e0 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
159f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
15a00 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
15a10 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
15a20 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
15a30 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
15a40 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
15a50 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
15a60 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
15a70 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
15a80 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
15a90 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
15aa0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
15ab0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
15ac0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
15ad0 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
15ae0 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
15af0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
15b00 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
15b10 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
15b20 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
15b30 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
15b40 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
15b50 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
15b60 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
15b70 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
15b80 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
15b90 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
15ba0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
15bb0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
15bc0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
15bd0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
15be0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
15bf0 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
15c00 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
15c10 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
15c20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
15c30 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
15c40 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
15c50 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
15c60 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
15c70 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
15c80 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
15c90 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
15ca0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
15cb0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
15cc0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
15cd0 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
15ce0 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
15cf0 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
15d00 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
15d10 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
15d20 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
15d30 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
15d40 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
15d50 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
15d60 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
15d70 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
15d80 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
15d90 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
15da0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15db0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15dc0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
15dd0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
15de0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
15df0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
15e00 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
15e10 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
15e20 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
15e30 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
15e40 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
15e50 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
15e60 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
15e70 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
15e80 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
15e90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
15ea0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
15eb0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
15ec0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
15ed0 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
15ee0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
15ef0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
15f00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15f10 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
15f20 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
15f30 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
15f40 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
15f50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
15f60 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
15f70 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
15f80 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
15f90 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
15fa0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
15fb0 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
15fc0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15fd0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
15fe0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
15ff0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16000 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
16010 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61  _CACHE.  /* If a
16020 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
16030 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
16040 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
16050 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
16060 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
16070 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
16080 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
16090 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
160a0 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
160b0 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
160c0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a  TE_LOCKED..  */.
160d0 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
160e0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
160f0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
16100 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74  ).   || (pBt->bt
16110 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
16120 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20  DING)!=0.  ){.  
16130 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
16140 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
16150 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
16160 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
16170 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
16180 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
16190 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
161a0 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
161b0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
161c0 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
161d0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
161e0 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
161f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16210 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
16220 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
16230 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
16240 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
16250 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
16260 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
16270 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
16280 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
16290 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
162a0 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
162b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
162c0 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
162d0 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
162e0 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
162f0 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
16300 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
16310 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
16320 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
16330 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
16340 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
16350 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
16360 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
16370 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
16380 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
16390 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
163a0 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
163b0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
163c0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
163d0 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c  &= ~BTS_INITIALL
163e0 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70  Y_EMPTY;.  if( p
163f0 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70  Bt->nPage==0 ) p
16400 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16410 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
16420 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  PTY;.  do {.    
16430 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
16440 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
16450 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
16460 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
16470 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
16480 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
16490 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
164a0 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
164b0 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
164c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
164d0 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
164e0 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
164f0 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
16500 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
16510 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
16520 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
16530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
16540 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
16550 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
16560 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
16570 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
16580 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
16590 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
165a0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
165b0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
165c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
165d0 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
165e0 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
165f0 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
16600 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
16610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16620 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
16630 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73     if( (pBt->bts
16640 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
16650 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
16660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16670 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
16680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16690 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
166a0 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
166b0 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
166c0 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
166d0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
166e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
166f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16700 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
16710 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
16720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16730 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
16740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16750 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
16760 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
16770 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30  .  }while( (rc&0
16780 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xFF)==SQLITE_BUS
16790 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
167a0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
167b0 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
167c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
167d0 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
167e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
167f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
16800 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
16810 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
16820 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
16830 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
16840 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
16850 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
16860 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
16870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16880 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
16890 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
168a0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
168b0 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
168c0 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
168d0 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
168e0 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
168f0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
16900 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
16910 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
16920 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
16930 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
16940 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
16950 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
16960 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
16970 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
16980 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
16990 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
169a0 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rans;.    }.    
169b0 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
169c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
169d0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
169e0 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
169f0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
16a00 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74  CHE.      assert
16a10 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
16a20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
16a30 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
16a40 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
16a50 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45  = ~BTS_EXCLUSIVE
16a60 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  ;.      if( wrfl
16a70 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46  ag>1 ) pBt->btsF
16a80 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c  lags |= BTS_EXCL
16a90 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  USIVE;.#endif.. 
16aa0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
16ab0 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69  b-size header fi
16ac0 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74  eld is incorrect
16ad0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
16ae0 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a  f an old.      *
16af0 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65  * client has bee
16b00 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  n writing the da
16b10 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70  tabase file), up
16b20 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69  date it now. Doi
16b30 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
16b40 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
16b50 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20  han later means 
16b60 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
16b70 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20  e can safely .  
16b80 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74      ** re-read t
16b90 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
16ba0 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20   from page 1 if 
16bb0 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74  a savepoint or t
16bc0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
16bd0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63   ** rollback occ
16be0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  urs within the t
16bf0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
16c00 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
16c10 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62  Bt->nPage!=get4b
16c20 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
16c30 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20  ta[28]) ){.     
16c40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16c50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
16c60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16c70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16c90 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
16ca0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
16cb0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
16cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16cd0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73     }.  }...trans
16ce0 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
16cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
16d00 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
16d10 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
16d20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
16d30 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
16d40 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
16d50 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
16d60 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
16d70 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
16d80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
16d90 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
16da0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
16db0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
16dc0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
16dd0 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
16de0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
16df0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
16e00 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
16e10 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
16e20 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
16e30 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
16e40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16e50 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16e60 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
16e70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16e80 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
16e90 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
16ea0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
16eb0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
16ec0 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
16ed0 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
16ee0 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
16ef0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
16f00 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
16f10 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
16f20 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
16f30 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
16f40 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
16f50 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
16f60 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
16f70 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
16f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16fa0 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
16fb0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
16fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16fe0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
16ff0 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
17000 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
17030 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
17040 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
17050 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
17060 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
17070 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
17080 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
17090 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
170a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
170b0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
170c0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49  );.  rc = btreeI
170d0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
170e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
170f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
17100 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
17110 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
17120 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
17130 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
17140 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
17150 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
17160 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
17170 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
17180 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
17190 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
171a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
171b0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
171c0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
171d0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
171e0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
171f0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
17200 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
17210 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
17220 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
17230 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
17240 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
17250 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
17260 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
17270 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
17280 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
17290 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
172a0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
172b0 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
172c0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
172d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
172e0 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
172f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17300 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
17310 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Page is a pointe
17320 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
17330 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f    Modify this po
17340 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74  inter so.** that
17350 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54   it points to iT
17360 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
17370 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
17380 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
17390 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69   to.** be modifi
173a0 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a  ed, as  follows:
173b0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
173c0 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
173d0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
173e0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
173f0 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
17400 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17410 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
17420 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
17430 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
17440 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
17450 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
17460 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
17470 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
17480 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
17490 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
174a0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
174b0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
174c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
174d0 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
174e0 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
174f0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
17500 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
17520 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
17530 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
17540 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
17550 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
17560 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
17570 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
17580 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65  8 eType){.  asse
17590 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
175a0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
175b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
175c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
175d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
175e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
175f0 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
17600 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
17610 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
17620 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
17630 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
17640 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
17650 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
17660 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
17670 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
17680 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
17690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
176a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
176b0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
176c0 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
176d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
176e0 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
176f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
17700 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
17710 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72   nCell;..    btr
17720 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
17730 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
17740 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
17750 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
17760 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
17770 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
17780 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
17790 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
177a0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
177b0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
177c0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
177d0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
177e0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
177f0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
17800 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
17810 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20  erflow.         
17820 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  && pCell+info.iO
17830 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65  verflow+3<=pPage
17840 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
17850 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20  askPage.        
17860 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62   && iFrom==get4b
17870 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
17880 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20  iOverflow]).    
17890 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
178a0 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
178b0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
178c0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
178d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
178e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
178f0 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
17900 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
17910 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
17920 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
17930 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
17940 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
17950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17960 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
17970 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
17980 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
17990 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
179a0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
179b0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
179c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
179d0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
179e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
179f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
17a00 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
17a10 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
17a20 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
17a30 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
17a40 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
17a50 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
17a60 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
17a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
17a80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
17a90 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
17aa0 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
17ab0 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
17ac0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
17ad0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
17ae0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
17af0 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
17b00 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
17b10 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
17b20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
17b30 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
17b40 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
17b50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
17b60 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
17b70 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
17b80 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
17b90 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
17ba0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
17bb0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
17bc0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
17bd0 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
17be0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
17bf0 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
17c00 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
17c10 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
17c20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
17c30 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
17c40 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
17c50 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17c70 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
17c80 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
17c90 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
17ca0 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
17cb0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
17cc0 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
17cd0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
17ce0 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
17cf0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
17d00 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
17d10 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
17d20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
17d30 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
17d40 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
17d50 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
17d60 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
17d70 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
17d80 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
17d90 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
17da0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
17db0 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
17dc0 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
17dd0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
17de0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
17df0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
17e00 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
17e10 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17e20 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
17e30 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
17e40 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
17e50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
17e60 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
17e70 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
17e80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17e90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17ea0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
17eb0 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
17ec0 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
17ed0 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
17ee0 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
17ef0 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
17f00 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
17f10 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
17f20 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
17f30 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
17f40 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
17f50 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
17f60 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
17f70 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
17f80 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
17f90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17fa0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
17fb0 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
17fc0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
17fd0 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
17fe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ff0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
18000 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
18010 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
18020 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
18030 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
18040 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
18050 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
18060 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
18070 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
18080 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
18090 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
180a0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
180b0 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
180c0 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
180d0 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
180e0 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
180f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
18100 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
18110 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
18120 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
18130 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
18140 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
18150 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
18160 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
18170 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
18180 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
18190 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
181a0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
181b0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
181c0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
181d0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
181e0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
181f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
18200 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
18210 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
18220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18230 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18240 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
18250 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
18260 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
18270 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
18280 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
18290 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
182a0 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
182b0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
182c0 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
182d0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
182e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
182f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18300 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
18310 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
18320 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
18330 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
18340 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
18350 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
18360 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
18370 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
18380 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
18390 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
183a0 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
183b0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
183c0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
183d0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
183e0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
183f0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
18400 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
18410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
18430 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18450 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
18460 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
18470 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18480 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
18490 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
184a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
184b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
184c0 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
184d0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
184e0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
184f0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
18500 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
18510 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
18520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18530 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
18540 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
18550 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
18560 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
18570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18580 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
18590 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
185a0 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
185b0 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
185c0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
185d0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
185e0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
185f0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
18600 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
18610 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
18620 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
18630 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
18640 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
18650 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
18660 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
18670 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
18680 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
18690 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
186a0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
186b0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
186c0 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
186d0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
186e0 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
186f0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
18700 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
18710 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
18720 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
18730 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
18740 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
18750 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
18760 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
18770 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
18780 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
18790 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
187a0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
187b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
187c0 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
187d0 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
187e0 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
187f0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
18800 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
18810 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
18820 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
18830 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
18840 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
18850 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
18860 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
18870 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
18880 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
18890 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
188a0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
188b0 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
188c0 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
188d0 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
188e0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
188f0 6e 2d 63 6f 6d 6d 6d 69 74 20 0a 2a 2a 20 6f 70  n-commmit .** op
18900 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73  eration, or fals
18910 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65  e for an increme
18920 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a  ntal vacuum..*/.
18930 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
18940 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
18950 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
18960 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
18970 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
18980 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
18990 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
189a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
189b0 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
189c0 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
189d0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
189e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
189f0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
18a00 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
18a10 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
18a20 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
18a30 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
18a40 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
18a50 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
18a60 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
18a70 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
18a80 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
18a90 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
18aa0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
18ab0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
18ac0 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
18ad0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18ae0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
18af0 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
18b00 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
18b10 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
18b20 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18b30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18b40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18b50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
18b60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
18b70 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
18b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18b90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
18ba0 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
18bb0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
18bc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43   ){.      if( bC
18bd0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
18be0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
18bf0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
18c00 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
18c10 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
18c20 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
18c30 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e   if bCommit is n
18c40 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
18c50 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
18c60 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
18c70 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
18c80 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
18c90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
18ca0 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
18cb0 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
18cc0 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
18cd0 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
18ce0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
18cf0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
18d00 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
18d10 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
18d20 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
18d30 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
18d40 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
18d50 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
18d60 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42  eePg, iLastPg, B
18d70 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
18d80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18da0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18db0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18dc0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
18dd0 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
18de0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18df0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
18e00 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
18e10 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
18e20 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
18e30 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
18e40 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
18e50 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
18e60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
18e70 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65  stPg;.      u8 e
18e80 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41  Mode = BTALLOC_A
18e90 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61  NY;   /* Mode pa
18ea0 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
18eb0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
18ec0 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e  */.      Pgno iN
18ed0 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ear = 0;        
18ee0 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72     /* nearby par
18ef0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
18f00 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
18f10 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  /..      rc = bt
18f20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18f30 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
18f40 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
18f50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18f60 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18f70 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
18f80 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69      /* If bCommi
18f90 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  t is zero, this 
18fa0 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
18fb0 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
18fc0 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
18fd0 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
18fe0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
18ff0 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
19000 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
19010 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
19020 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
19030 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69  nd, if bCommit i
19040 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
19050 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
19060 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
19070 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
19080 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
19090 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
190a0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
190b0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
190c0 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
190d0 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
190e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
190f0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45  ode = BTALLOC_LE
19100 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20  ;.        iNear 
19110 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
19120 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
19130 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
19140 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
19150 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
19160 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
19170 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65  g, &iFreePg, iNe
19180 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  ar, eMode);.    
19190 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
191a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
191b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
191c0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
191d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
191e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
191f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
19200 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
19210 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69  le( bCommit && i
19220 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
19230 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
19240 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
19250 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
19260 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
19270 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
19280 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
19290 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b  reePg, bCommit);
192a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
192b0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
192c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
192d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
192e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
192f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
19300 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
19310 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
19320 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
19330 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d  }while( iLastPg=
19340 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
19350 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41  GE(pBt) || PTRMA
19360 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
19370 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42  astPg) );.    pB
19380 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
19390 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61   1;.    pBt->nPa
193a0 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20  ge = iLastPg;.  
193b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
193c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
193d0 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
193e0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
193f0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
19400 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
19410 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67  ase.** nOrig pag
19420 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
19430 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65  ining nFree free
19440 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74   pages. Return t
19450 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
19460 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
19470 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f  base in pages fo
19480 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d  llowing an auto-
19490 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
194a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
194b0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53   finalDbSize(BtS
194c0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
194d0 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72   nOrig, Pgno nFr
194e0 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  ee){.  int nEntr
194f0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
19500 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19510 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
19520 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
19530 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70  /.  Pgno nPtrmap
19540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19550 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19560 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
19570 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50   be freed */.  P
19580 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
19590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
195a0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
195b0 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  /..  nEntry = pB
195c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
195d0 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46  .  nPtrmap = (nF
195e0 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
195f0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
19600 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
19610 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ry;.  nFin = nOr
19620 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
19630 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69  rmap;.  if( nOri
19640 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
19650 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
19660 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
19670 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
19680 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69  Fin--;.  }.  whi
19690 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
196a0 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
196b0 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
196c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
196d0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
196e0 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a  .  return nFin;.
196f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
19700 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
19710 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
19720 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
19730 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
19740 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
19750 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
19760 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
19770 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
19780 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
19790 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
197a0 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
197b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
197c0 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
197d0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
197e0 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
197f0 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
19800 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
19810 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
19820 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19830 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
19840 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
19850 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
19860 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
19870 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
19880 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19890 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
198a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
198b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
198c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
198d0 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
198e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
198f0 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
19900 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
19910 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
19920 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
19930 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e{.    Pgno nOri
19940 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
19950 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e  nt(pBt);.    Pgn
19960 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79  o nFree = get4by
19970 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
19980 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
19990 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e   Pgno nFin = fin
199a0 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
199b0 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20  rig, nFree);..  
199c0 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e    if( nOrig<nFin
199d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
199e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
199f0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
19a00 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  ( nFree>0 ){.   
19a10 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
19a20 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
19a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
19a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19a50 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
19a60 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
19a70 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72  (pBt);.        r
19a80 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
19a90 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f  ep(pBt, nFin, nO
19aa0 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  rig, 0);.      }
19ab0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19ac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19ae0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
19af0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
19b00 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
19b10 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
19b20 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
19b30 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  >nPage);.      }
19b40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19b50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
19b60 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NE;.    }.  }.  
19b70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19b80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19b90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
19ba0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19bb0 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
19bc0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
19bd0 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
19be0 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65  n.** is committe
19bf0 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
19c00 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
19c10 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
19c20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
19c30 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
19c40 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
19c50 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
19c60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19c70 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
19c80 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
19c90 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
19ca0 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
19cb0 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
19cc0 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
19cd0 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
19ce0 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
19cf0 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
19d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19d10 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
19d20 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19d30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19d40 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
19d50 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
19d60 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
19d70 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
19d80 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
19d90 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
19da0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19db0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
19dc0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
19dd0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
19de0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
19df0 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
19e00 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
19e10 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
19e20 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
19e30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19e40 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
19e50 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
19e60 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
19e70 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
19e80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19e90 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
19ea0 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
19eb0 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ly */.    Pgno i
19ec0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
19ed0 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
19ee0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
19ef0 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
19f00 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
19f10 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65  size before free
19f20 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69  ing */..    nOri
19f30 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
19f40 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  nt(pBt);.    if(
19f50 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
19f60 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
19f70 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
19f80 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
19f90 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
19fa0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
19fb0 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
19fc0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
19fd0 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
19fe0 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
19ff0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
1a000 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
1a010 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
1a020 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
1a030 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
1a040 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
1a050 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1a060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a070 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1a080 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
1a090 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1a0a0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1a0b0 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  6]);.    nFin = 
1a0c0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1a0d0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1a0e0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
1a0f0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
1a100 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1a110 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f  .    if( nFin<nO
1a120 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
1a130 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1a140 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1a150 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65   }.    for(iFree
1a160 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
1a170 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
1a180 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
1a190 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1a1a0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1a1b0 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20  in, iFree, 1);. 
1a1c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
1a1d0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
1a1e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
1a1f0 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
1a200 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a210 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1a220 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1a230 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1a240 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1a250 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
1a260 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1a270 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1a280 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
1a290 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1a2a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1a2b0 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
1a2c0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1a2d0 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = 1;.      pBt->
1a2e0 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
1a2f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1a300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a310 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1a320 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1a330 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1a340 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69  sert( nRef>=sqli
1a350 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1a360 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
1a370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
1a380 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
1a390 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a3a0 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
1a3b0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
1a3c0 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
1a3d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
1a3e0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1a3f0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
1a400 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
1a410 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1a420 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
1a430 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
1a440 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
1a450 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
1a460 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
1a470 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
1a480 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
1a490 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
1a4a0 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
1a4b0 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
1a4c0 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
1a4d0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
1a4e0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
1a4f0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
1a500 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
1a510 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1a520 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
1a530 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
1a540 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
1a550 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
1a560 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
1a570 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
1a580 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1a590 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1a5a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1a5b0 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
1a5c0 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
1a5d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
1a5e0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
1a5f0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
1a600 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
1a610 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
1a620 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
1a630 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
1a640 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1a650 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
1a660 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
1a670 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1a680 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
1a690 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
1a6a0 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
1a6b0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1a6c0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
1a6d0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
1a6e0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
1a6f0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
1a700 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
1a710 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
1a720 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
1a730 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
1a740 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1a750 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
1a760 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1a770 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1a780 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1a790 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
1a7a0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
1a7b0 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
1a7c0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
1a7d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1a7e0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
1a7f0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1a800 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
1a810 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
1a820 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a830 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1a840 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
1a850 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
1a860 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
1a870 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
1a880 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
1a890 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
1a8a0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
1a8b0 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
1a8c0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
1a8d0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
1a8e0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1a8f0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
1a900 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
1a910 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1a920 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
1a930 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1a940 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
1a950 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1a960 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1a970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1a980 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a990 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1a9a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a9b0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
1a9c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a9d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a9e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1a9f0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
1aa00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1aa10 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
1aa20 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
1aa30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1aa40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aa50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1aa60 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
1aa70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1aa80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1aa90 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1aaa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1aab0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1aac0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
1aad0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1aae0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
1aaf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ab00 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1ab10 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
1ab20 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
1ab30 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ab40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ab50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1ab60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ab70 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
1ab80 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1ab90 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
1aba0 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
1abb0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
1abc0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
1abd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1abe0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1abf0 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
1ac00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ac10 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1ac20 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
1ac30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ac40 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1ac50 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  p) );..#ifndef S
1ac60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1ac70 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f  ACUUM.  pBt->bDo
1ac80 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65  Truncate = 0;.#e
1ac90 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ndif.  if( p->in
1aca0 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1acb0 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   && db->nVdbeRea
1acc0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  d>1 ){.    /* If
1acd0 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1ace0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
1acf0 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
1ad00 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
1ad10 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
1ad20 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
1ad30 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1ad40 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
1ad50 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
1ad60 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
1ad70 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1ad80 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
1ad90 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
1ada0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1adb0 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
1adc0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
1add0 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1ade0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1adf0 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
1ae00 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
1ae10 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
1ae20 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
1ae30 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
1ae40 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
1ae50 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1ae60 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
1ae70 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
1ae80 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1ae90 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
1aea0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
1aeb0 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
1aec0 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
1aed0 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
1aee0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
1aef0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
1af00 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1af10 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
1af20 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1af30 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
1af40 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
1af50 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
1af60 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1af70 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
1af80 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1af90 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
1afa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1afb0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
1afc0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
1afd0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
1afe0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
1aff0 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
1b000 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
1b010 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
1b020 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1b030 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
1b040 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
1b050 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
1b060 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1b070 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1b080 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
1b090 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
1b0a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
1b0b0 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
1b0c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1b0d0 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
1b0e0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1b0f0 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
1b100 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
1b110 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1b120 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
1b130 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1b140 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
1b150 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
1b160 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
1b170 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1b180 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
1b190 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1b1a0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
1b1b0 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
1b1c0 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
1b1d0 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
1b1e0 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
1b1f0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
1b200 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
1b210 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
1b220 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
1b230 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
1b240 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
1b250 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
1b260 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
1b270 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
1b280 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1b290 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
1b2a0 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
1b2b0 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
1b2c0 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
1b2d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1b2e0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
1b2f0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70  curs while the p
1b300 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74  ager layer is at
1b310 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20  tempting to .** 
1b320 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  finalize the und
1b330 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  erlying journal 
1b340 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  file, this funct
1b350 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
1b360 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20  rror and.** the 
1b370 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
1b380 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62   attempt a rollb
1b390 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ack. However, if
1b3a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1b3b0 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  ment.** is non-z
1b3c0 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d  ero then this b-
1b3d0 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
1b3e0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75   is part of a mu
1b3f0 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61  lti-file .** tra
1b400 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
1b410 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e  s case, the tran
1b420 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
1b430 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74  ady been committ
1b440 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74  ed .** (by delet
1b450 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
1b460 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
1b470 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69  he caller will i
1b480 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  gnore this .** f
1b490 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
1b4a0 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69  code. So, even i
1b4b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b4c0 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c  s in the pager l
1b4d0 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74  ayer,.** reset t
1b4e0 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
1b4f0 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  s internal state
1b500 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1b510 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74  t the write.** t
1b520 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
1b530 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  een closed. This
1b540 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20   is quite safe, 
1b550 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  as the pager wil
1b560 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69  l have.** transi
1b570 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72  tioned to the er
1b580 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
1b590 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1b5a0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1b5b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b5c0 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1b5d0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1b5e0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1b5f0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1b600 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1b610 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1b620 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
1b630 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65  ree *p, int bCle
1b640 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d  anup){..  if( p-
1b650 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b660 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51  NONE ) return SQ
1b670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
1b680 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b690 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b6a0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1b6b0 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
1b6c0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1b6d0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
1b6e0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
1b6f0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
1b700 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
1b710 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1b720 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
1b730 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1b740 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1b750 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1b760 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b770 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1b780 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1b790 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1b7a0 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
1b7b0 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
1b7c0 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
1b7d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b7e0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1b7f0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1b800 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b810 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d  OK && bCleanup==
1b820 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1b830 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1b850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
1b860 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1b870 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
1b880 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
1b890 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
1b8a0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1b8b0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1b8c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b8d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1b8e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b8f0 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
1b900 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
1b910 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1b920 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
1b930 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1b940 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b950 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b960 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1b970 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
1b980 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b990 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1b9a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1b9b0 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
1b9c0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1b9d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1b9e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b9f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1ba00 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
1ba10 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
1ba20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
1ba30 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
1ba40 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
1ba50 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
1ba60 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
1ba70 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
1ba80 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
1ba90 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
1baa0 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
1bab0 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
1bac0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1bad0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
1bae0 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
1baf0 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
1bb00 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
1bb10 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
1bb20 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
1bb30 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
1bb40 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
1bb50 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
1bb60 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
1bb70 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
1bb80 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
1bb90 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
1bba0 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
1bbb0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
1bbc0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1bbd0 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
1bbe0 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
1bbf0 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
1bc00 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
1bc10 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
1bc20 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
1bc30 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
1bc40 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
1bc50 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
1bc60 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1bc70 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
1bc80 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
1bc90 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
1bca0 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72  r *p;.  if( pBtr
1bcb0 65 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ee==0 ) return;.
1bcc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1bcd0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
1bce0 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
1bcf0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1bd00 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1bd10 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
1bd20 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1bd30 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74  r(p);.    p->eSt
1bd40 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
1bd50 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e  LT;.    p->skipN
1bd60 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
1bd70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
1bd80 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1bd90 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1bda0 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
1bdb0 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
1bdc0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
1bdd0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1bde0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d  Leave(pBtree);.}
1bdf0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1be00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1be10 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41   in progress.  A
1be20 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
1be30 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20  be.** invalided 
1be40 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
1be50 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  n.  Any attempt 
1be60 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a  to use a cursor.
1be70 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  ** that was open
1be80 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
1be90 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
1bea0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
1beb0 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ** in an error..
1bec0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1bed0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1bee0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1bef0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1bf00 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1bf10 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1bf20 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1bf30 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1bf40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1bf50 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
1bf60 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
1bf70 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ode){.  int rc;.
1bf80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1bf90 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
1bfa0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
1bfb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1bfc0 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70  r(p);.  if( trip
1bfd0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
1bfe0 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70  ){.    rc = trip
1bff0 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75  Code = saveAllCu
1c000 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1c010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1c020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c030 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
1c040 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1c050 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1c060 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 29  ors(p, tripCode)
1c070 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74  ;.  }.  btreeInt
1c080 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66  egrity(p);..  if
1c090 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1c0a0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1c0b0 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61   int rc2;..    a
1c0c0 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
1c0d0 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
1c0e0 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
1c0f0 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
1c100 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
1c110 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1c120 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
1c130 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
1c140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1c150 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1c160 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
1c170 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
1c180 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
1c190 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74  ** call btreeGet
1c1a0 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
1c1b0 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
1c1c0 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
1c1d0 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
1c1e0 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
1c1f0 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61    if( btreeGetPa
1c200 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
1c210 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
1c220 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
1c230 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1c240 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
1c250 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65  aData);.      te
1c260 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
1c270 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50   );.      if( nP
1c280 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  age==0 ) sqlite3
1c290 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1c2a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
1c2b0 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ge);.      testc
1c2c0 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
1c2d0 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =nPage );.      
1c2e0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
1c2f0 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  ge;.      releas
1c300 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
1c310 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1c320 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1c330 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
1c340 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1c350 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1c360 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1c370 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1c380 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1c390 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1c3a0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1c3b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1c3c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c3d0 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
1c3e0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1c3f0 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
1c400 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62  action can can b
1c410 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1c420 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
1c430 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1c440 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
1c450 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
1c460 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
1c470 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
1c480 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1c490 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
1c4a0 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
1c4b0 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
1c4c0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1c4d0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
1c4e0 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
1c4f0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1c500 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
1c510 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
1c520 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
1c530 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
1c540 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
1c550 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
1c560 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
1c570 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
1c580 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1c590 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
1c5a0 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
1c5b0 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
1c5c0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
1c5d0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1c5e0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1c5f0 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1c600 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
1c610 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
1c620 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
1c630 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
1c640 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1c650 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
1c660 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1c670 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1c680 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1c690 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
1c6a0 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
1c6b0 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
1c6c0 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
1c6d0 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
1c6e0 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
1c6f0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1c700 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
1c710 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
1c720 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
1c730 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
1c740 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
1c750 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1c760 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
1c770 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
1c780 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
1c790 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1c7a0 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
1c7b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c7c0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
1c7d0 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
1c7e0 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
1c7f0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1c800 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1c810 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1c820 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
1c830 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c840 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1c850 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
1c860 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1c870 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1c880 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
1c890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1c8a0 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
1c8b0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
1c8c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1c8d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1c8e0 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
1c8f0 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
1c900 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
1c910 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
1c920 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
1c930 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
1c940 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
1c950 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
1c960 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
1c970 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
1c980 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
1c990 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
1c9a0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1c9b0 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
1c9c0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
1c9d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1c9e0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1c9f0 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
1ca00 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1ca10 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1ca20 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1ca30 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
1ca40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ca50 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1ca60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1ca70 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1ca80 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1ca90 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
1caa0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
1cab0 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
1cac0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
1cad0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
1cae0 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
1caf0 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
1cb00 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
1cb10 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
1cb20 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
1cb30 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1cb40 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
1cb50 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1cb60 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
1cb70 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1cb80 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
1cb90 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
1cba0 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
1cbb0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
1cbc0 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
1cbd0 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
1cbe0 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
1cbf0 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
1cc00 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
1cc10 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
1cc20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
1cc30 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
1cc40 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
1cc50 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
1cc60 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
1cc70 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
1cc80 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
1cc90 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
1cca0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1ccb0 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
1ccc0 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
1ccd0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
1cce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1ccf0 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
1cd00 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1cd10 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1cd20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1cd30 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
1cd40 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1cd50 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
1cd60 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
1cd70 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
1cd80 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
1cd90 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
1cda0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1cdb0 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
1cdc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1cdd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1cde0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
1cdf0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
1ce00 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
1ce10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ce20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1ce30 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
1ce40 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1ce50 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c  s & BTS_INITIALL
1ce60 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20  Y_EMPTY)!=0 ){. 
1ce70 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
1ce80 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1ce90 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1cea0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1ceb0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1cec0 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1ced0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1cee0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1cef0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1cf00 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1cf10 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1cf20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1cf30 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1cf40 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1cf50 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1cf60 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1cf70 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1cf80 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1cf90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cfa0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1cfb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1cfc0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1cfd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cfe0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1cff0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1d000 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1d010 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1d020 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1d030 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1d040 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1d050 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1d060 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1d070 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1d080 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1d090 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1d0a0 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1d0b0 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1d0c0 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1d0d0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1d0e0 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1d0f0 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1d100 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1d110 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1d120 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1d130 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1d140 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1d150 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1d160 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1d170 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1d180 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1d190 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1d1a0 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1d1b0 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1d1c0 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1d1d0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1d1e0 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1d1f0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1d200 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1d210 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1d220 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1d230 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1d240 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1d250 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1d260 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1d270 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1d280 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1d290 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1d2a0 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1d2b0 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1d2c0 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1d2d0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1d2e0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1d2f0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1d300 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1d310 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1d320 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1d330 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1d340 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1d350 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1d360 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1d370 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1d380 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1d390 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1d3a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1d3b0 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1d3c0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1d3d0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1d3e0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1d3f0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1d400 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1d410 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1d420 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1d430 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1d440 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1d450 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1d460 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1d470 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1d480 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1d490 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1d4a0 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1d4b0 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1d4c0 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1d4d0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1d4e0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1d4f0 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
1d500 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
1d510 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
1d520 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
1d530 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
1d540 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
1d550 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
1d560 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
1d570 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d5a0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1d5b0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1d5e0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1d5f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1d600 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d620 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1d630 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1d640 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1d650 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1d660 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1d670 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
1d680 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
1d690 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1d6c0 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
1d6d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1d6e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d700 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
1d710 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
1d720 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1d730 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1d740 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1d750 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
1d760 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1d770 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
1d780 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
1d790 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
1d7a0 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
1d7b0 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1d7c0 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
1d7d0 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1d7e0 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
1d7f0 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
1d800 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
1d810 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
1d820 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
1d830 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
1d840 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
1d850 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d860 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1d870 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
1d880 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
1d890 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
1d8a0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1d8b0 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
1d8c0 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
1d8d0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
1d8e0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1d8f0 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
1d900 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
1d910 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
1d920 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
1d930 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
1d940 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1d950 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
1d960 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1d970 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1d980 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
1d990 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
1d9a0 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
1d9b0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1d9c0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1d9d0 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  LY)!=0) ){.    r
1d9e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
1d9f0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
1da00 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
1da10 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1da20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
1da30 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
1da40 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
1da50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
1da60 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
1da70 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
1da80 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
1da90 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
1daa0 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
1dab0 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
1dac0 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
1dad0 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
1dae0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
1daf0 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
1db00 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
1db10 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
1db20 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1db30 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
1db40 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
1db50 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20   pBt;.  assert( 
1db60 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
1db70 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46  lag==BTCF_WriteF
1db80 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63  lag );.  pCur->c
1db90 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  urFlags = wrFlag
1dba0 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  ;.  pCur->pNext 
1dbb0 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
1dbc0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1dbd0 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
1dbe0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1dbf0 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70  ur;.  }.  pBt->p
1dc00 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
1dc10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1dc20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1dc30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dc40 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1dc50 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
1dc60 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dc90 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1dca0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1dcd0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1dce0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1dcf0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1dd20 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1dd30 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1dd40 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1dd50 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1dd60 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1dd70 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
1dd80 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1dd90 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
1ddc0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
1ddd0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1dde0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ddf0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1de00 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1de10 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1de20 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1de30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1de40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1de50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1de60 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1de70 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1de80 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1de90 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1dea0 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1deb0 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1dec0 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1ded0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1dee0 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1def0 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1df00 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1df10 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1df20 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1df30 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1df40 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1df50 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1df60 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1df70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1df80 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1df90 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
1dfa0 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
1dfb0 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
1dfc0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
1dfd0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
1dfe0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
1dff0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
1e000 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
1e010 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
1e020 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
1e030 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
1e040 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
1e050 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
1e060 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
1e070 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
1e080 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
1e090 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
1e0a0 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
1e0b0 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
1e0c0 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
1e0d0 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
1e0e0 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
1e0f0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
1e100 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
1e110 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1e120 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
1e130 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
1e140 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
1e150 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50  tof(BtCursor, iP
1e160 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
1e170 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
1e180 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
1e190 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1e1a0 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
1e1b0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
1e1c0 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
1e1d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1e1e0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
1e1f0 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
1e200 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
1e210 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
1e220 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
1e230 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1e240 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1e250 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20  = pCur->pBt;.   
1e260 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1e270 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1e280 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1e290 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
1e2a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72     if( pCur->pPr
1e2b0 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ev ){.      pCur
1e2c0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
1e2d0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1e2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e2f0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
1e300 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1e310 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1e320 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43  Next ){.      pC
1e330 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
1e340 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
1e350 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1e360 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
1e370 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
1e380 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
1e390 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1e3a0 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
1e3b0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1e3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1e3d0 65 65 28 70 42 74 72 65 65 2d 3e 64 62 2c 20 70  ee(pBtree->db, p
1e3e0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
1e3f0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1e400 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
1e410 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1e420 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1e430 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e440 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
1e450 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
1e460 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
1e470 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
1e480 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
1e490 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
1e4a0 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
1e4b0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
1e4c0 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
1e4d0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
1e4e0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
1e4f0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
1e500 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
1e510 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1e520 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
1e530 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
1e540 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
1e550 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
1e560 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
1e570 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
1e580 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
1e590 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
1e5a0 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
1e5b0 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
1e5c0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
1e5d0 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
1e5e0 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
1e5f0 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
1e600 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
1e610 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
1e620 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
1e630 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
1e640 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
1e650 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
1e660 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1e670 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
1e680 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
1e690 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
1e6a0 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
1e6b0 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
1e6c0 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
1e6d0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1e6e0 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
1e6f0 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
1e700 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
1e710 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
1e720 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
1e730 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
1e740 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1e750 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
1e760 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
1e770 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1e780 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
1e790 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
1e7a0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
1e7b0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1e7c0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1e7d0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
1e7e0 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
1e7f0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1e800 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26  T_DB || memcmp(&
1e810 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
1e820 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
1e830 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
1e840 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
1e850 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
1e860 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f  dif.#ifdef _MSC_
1e870 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72  VER.  /* Use a r
1e880 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  eal function in 
1e890 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f  MSVC to work aro
1e8a0 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74  und bugs in that
1e8b0 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20   compiler. */.  
1e8c0 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43  static void getC
1e8d0 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
1e8e0 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28   *pCur){.    if(
1e8f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1e900 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  e==0 ){.      in
1e910 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1e920 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72  iPage;.      btr
1e930 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1e940 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1e950 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1e960 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1e970 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
1e980 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
1e990 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c  lidNKey;.    }el
1e9a0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e9b0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1e9c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
1e9d0 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
1e9e0 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
1e9f0 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
1ea00 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
1ea10 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
1ea20 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
1ea30 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
1ea40 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 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 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
1ea90 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
1eae0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72    \.    btreePar
1eb30 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1eb40 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1eb50 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1eb60 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20  Cur->info);     
1eb70 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63     \.    pCur->c
1eb80 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
1eb90 56 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20 20 20  ValidNKey;      
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1ec20 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1ec70 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1ec80 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  /..#ifndef NDEBU
1ec90 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  G  /* The next r
1eca0 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79  outine used only
1ecb0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1ecc0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f   statements */./
1ecd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1ece0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74   if the given Bt
1ecf0 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  Cursor is valid.
1ed00 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72    A valid cursor
1ed10 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20   is one.** that 
1ed20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1ed30 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69  nting to a row i
1ed40 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20  n a (non-empty) 
1ed50 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69  table..** This i
1ed60 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e  s a verification
1ed70 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1ed80 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
1ed90 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1eda0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1edb0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1edc0 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1edd0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1ede0 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  r && pCur->eStat
1edf0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
1ee00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45  .}.#endif /* NDE
1ee10 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  BUG */../*.** Se
1ee20 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1ee30 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
1ee40 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
1ee50 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
1ee60 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
1ee70 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
1ee80 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
1ee90 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
1eea0 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
1eeb0 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
1eec0 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
1eed0 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
1eee0 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
1eef0 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
1ef00 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
1ef10 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
1ef20 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1ef30 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
1ef40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1ef50 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e  er must position
1ef60 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f   the cursor prio
1ef70 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1ef80 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  is routine..** .
1ef90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1efa0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74  cannot fail.  It
1efb0 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1efc0 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a  SQLITE_OK.  .*/.
1efd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1efe0 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1eff0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1f000 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1f010 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f020 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1f030 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f040 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1f050 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
1f060 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f070 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1f080 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
1f090 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20  D ){.    *pSize 
1f0a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1f0b0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1f0c0 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ur);.    *pSize 
1f0d0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1f0e0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
1f0f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f100 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1f110 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1f120 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1f130 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
1f140 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
1f150 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
1f160 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1f170 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
1f180 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
1f190 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
1f1a0 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
1f1b0 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
1f1c0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
1f1d0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
1f1e0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
1f1f0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1f200 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
1f210 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f220 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
1f230 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
1f240 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
1f250 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1f260 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
1f270 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
1f280 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
1f290 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
1f2a0 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
1f2b0 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
1f2c0 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
1f2d0 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
1f2e0 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
1f2f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f300 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
1f310 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
1f320 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1f330 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f340 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1f350 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1f360 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f370 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
1f380 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
1f390 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1f3a0 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53  Data;.  return S
1f3b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f3c0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
1f3d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
1f3e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1f3f0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
1f400 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
1f410 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1f420 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
1f430 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1f440 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
1f450 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
1f460 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1f470 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
1f480 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
1f490 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
1f4a0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
1f4b0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
1f4c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1f4d0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
1f4e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1f4f0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
1f500 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1f510 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1f520 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
1f530 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1f540 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
1f550 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1f560 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
1f570 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
1f580 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
1f590 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
1f5a0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
1f5b0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
1f5c0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
1f5d0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
1f5e0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
1f5f0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
1f600 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
1f610 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
1f620 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
1f630 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
1f640 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
1f650 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
1f660 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1f670 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
1f680 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
1f690 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1f6a0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
1f6b0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
1f6c0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
1f6d0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
1f6e0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
1f6f0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
1f700 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
1f710 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
1f720 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
1f730 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
1f740 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
1f750 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
1f760 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
1f770 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
1f780 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
1f790 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1f7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f7b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f7c0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
1f7f0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1f800 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
1f810 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
1f820 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
1f830 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
1f840 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
1f850 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
1f860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1f870 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
1f880 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1f890 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
1f8a0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1f8b0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
1f8c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f8d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f8e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1f8f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1f900 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
1f910 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f920 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f930 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
1f940 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
1f950 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1f960 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
1f970 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
1f980 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1f990 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
1f9a0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
1f9b0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
1f9c0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
1f9d0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
1f9e0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
1f9f0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
1fa00 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
1fa10 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
1fa20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
1fa30 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
1fa40 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
1fa50 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
1fa60 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
1fa70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1fa80 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
1fa90 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
1faa0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
1fab0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
1fac0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1fad0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
1fae0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
1faf0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1fb00 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
1fb10 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
1fb20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
1fb30 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1fb40 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1fb50 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
1fb60 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
1fb70 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1fb80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1fb90 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
1fba0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
1fbb0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
1fbc0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
1fbd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
1fbe0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1fbf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1fc00 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1fc10 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
1fc20 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1fc30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fc40 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
1fc50 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1fc60 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
1fc70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
1fc80 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
1fc90 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1fca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1fcb0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
1fcc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fcd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
1fce0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
1fcf0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1fd00 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
1fd10 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
1fd20 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
1fd30 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
1fd40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1fd50 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
1fd60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
1fd70 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1fd80 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
1fd90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
1fda0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1fdb0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
1fdc0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
1fdd0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
1fde0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
1fdf0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
1fe00 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
1fe10 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
1fe20 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
1fe30 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
1fe40 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
1fe50 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1fe60 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
1fe70 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
1fe80 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
1fe90 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
1fea0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
1feb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1fec0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
1fed0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
1fee0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
1fef0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
1ff00 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
1ff10 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
1ff20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1ff30 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1ff40 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
1ff50 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
1ff60 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
1ff70 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
1ff80 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
1ff90 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ffa0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
1ffb0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ffd0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
1ffe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
20010 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
20020 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
20030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
20040 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
20050 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
20060 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
20070 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
20080 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
20090 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
200a0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
200b0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
200c0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
200d0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
200e0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
200f0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
20100 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
20110 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
20120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20130 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20140 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
20150 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
20160 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
20170 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
20180 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
20190 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
201a0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
201b0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
201c0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
201d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
201e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
201f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20200 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
20210 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
20220 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
20230 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
20240 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
20250 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
20260 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
20270 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
20280 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
20290 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
202a0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
202b0 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
202c0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
202d0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
202e0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
202f0 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
20300 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
20310 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
20320 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
20330 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
20340 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
20350 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
20360 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
20370 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
20380 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
20390 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
203a0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
203b0 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
203c0 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
203d0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
203e0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
203f0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
20400 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
20410 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
20420 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
20430 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
20440 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
20450 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
20460 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
20470 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
20480 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
20490 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
204a0 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
204b0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
204c0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
204d0 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
204e0 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
204f0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
20500 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
20510 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
20520 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
20530 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
20540 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
20550 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
20560 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
20570 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
20580 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
20590 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
205a0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
205b0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
205c0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
205d0 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
205e0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
205f0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
20600 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
20610 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
20620 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
20630 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
20640 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
20650 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
20660 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
20670 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
20680 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
20690 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
206a0 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
206b0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
206c0 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
206d0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
206e0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
206f0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
20700 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
20710 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
20720 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
20730 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
20740 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
20750 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
20760 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
20770 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
20780 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
20790 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
207a0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
207b0 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
207c0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
207d0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
207e0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
207f0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
20800 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
20810 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
20820 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
20830 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
20840 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
20850 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
20860 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
20870 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
20880 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
20890 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
208a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
208b0 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
208c0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
208d0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
208e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
208f0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
20900 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
20910 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
20920 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
20930 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
20940 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
20950 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
20960 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
20970 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
20980 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 69  VERFLOW_READ.  i
20990 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20  nt bEnd;        
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
209c0 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f  ue if reading to
209d0 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a   end of data */.
209e0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
209f0 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
20a00 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20a10 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20a30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20a40 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
20a50 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
20a60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20a70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
20a80 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66  rt( eOp!=2 || of
20a90 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  fset==0 );      
20aa0 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20  /* Always start 
20ab0 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66  from beginning f
20ac0 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20  or eOp==2 */..  
20ad0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
20ae0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
20af0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
20b00 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
20b10 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
20b20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
20b30 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
20b40 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 23 69 66 64  info.nKey);.#ifd
20b50 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
20b60 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
20b70 20 62 45 6e 64 20 3d 20 28 6f 66 66 73 65 74 2b   bEnd = (offset+
20b80 61 6d 74 3d 3d 6e 4b 65 79 2b 70 43 75 72 2d 3e  amt==nKey+pCur->
20b90 69 6e 66 6f 2e 6e 44 61 74 61 29 3b 0a 23 65 6e  info.nData);.#en
20ba0 64 69 66 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  dif..  if( NEVER
20bb0 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b  (offset+amt > nK
20bc0 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
20bd0 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61  ata) .   || &aPa
20be0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
20bf0 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
20c00 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
20c10 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20  ableSize].  ){. 
20c20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
20c30 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
20c40 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
20c50 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
20c60 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
20c70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20c80 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
20c90 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
20ca0 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
20cb0 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
20cc0 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
20cd0 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
20ce0 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
20cf0 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
20d00 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
20d10 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
20d20 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
20d30 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
20d40 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
20d50 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
20d60 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
20d70 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
20d80 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20  , pBuf, a, (eOp 
20d90 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e  & 0x01), pPage->
20da0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
20db0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
20dc0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
20dd0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
20de0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
20df0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
20e00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
20e10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
20e20 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
20e30 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
20e40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
20e50 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
20e60 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
20e70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
20e80 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
20e90 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
20ea0 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
20eb0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
20ec0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
20ed0 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
20ee0 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65  low[] has not be
20ef0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
20f00 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20  locate it now.. 
20f10 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f     ** Except, do
20f20 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f   not allocate aO
20f30 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f  verflow[] for eO
20f40 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  p==2..    **.   
20f50 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
20f60 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
20f70 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
20f80 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
20f90 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
20fa0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
20fb0 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
20fc0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
20fd0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
20fe0 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
20ff0 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
21000 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
21010 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
21020 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
21030 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
21040 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
21050 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
21060 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
21070 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32  /.    if( eOp!=2
21080 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
21090 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
210a0 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
210b0 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
210c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
210d0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
210e0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
210f0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
21100 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d   if( nOvfl>pCur-
21110 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20  >nOvflAlloc ){. 
21120 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
21130 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
21140 65 33 44 62 52 65 61 6c 6c 6f 63 28 0a 20 20 20  e3DbRealloc(.   
21150 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
21160 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d  Btree->db, pCur-
21170 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
21180 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
21190 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
211a0 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
211b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
211c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
211d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
211e0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
211f0 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
21200 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
21210 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
21220 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
21230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21250 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
21260 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
21270 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
21280 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
21290 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
212a0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
212b0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
212c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
212d0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
212e0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
212f0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
21300 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
21310 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
21320 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
21330 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
21340 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
21350 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
21360 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
21370 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
21380 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
21390 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  =0 && pCur->aOve
213a0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
213b0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
213c0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
213d0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
213e0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
213f0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
21400 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
21410 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
21420 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  e);.    }..    f
21430 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
21440 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
21450 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
21460 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ){..      /* If 
21470 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
21480 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
21490 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
214a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
214b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
214c0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
214d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
214e0 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
214f0 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
21500 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
21510 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
21520 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
21530 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
21540 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
21550 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66   }..      if( of
21560 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
21570 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
21580 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
21590 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
215a0 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
215b0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
215c0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
215d0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
215e0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
215f0 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
21600 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
21610 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
21620 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
21630 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
21640 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
21650 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
21660 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
21670 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
21680 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
21690 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
216a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
216b0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
216c0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
216d0 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c  rray must be all
216e0 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65  ocated because e
216f0 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a  Op!=2.        **
21700 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d   here.  If eOp==
21710 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d  2, then offset==
21720 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63  0 and this branc
21730 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e  h is never taken
21740 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
21750 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
21760 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=2 );.        a
21770 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
21780 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
21790 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
217a0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
217b0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
217c0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
217d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
217e0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
217f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21800 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
21810 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
21820 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
21830 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
21840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
21850 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
21860 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21870 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
21880 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
21890 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
218a0 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
218b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
218c0 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
218d0 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
218e0 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
218f0 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
21900 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
21910 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
21920 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
21930 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
21940 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  fd;.#endif.     
21950 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
21960 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
21970 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
21980 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
21990 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
219a0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
219b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
219c0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
219d0 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
219e0 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
219f0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
21a00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
21a10 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
21a20 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
21a30 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
21a40 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
21a50 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
21a60 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
21a70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
21a80 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
21a90 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  3) the database 
21aa0 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
21ab0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
21ac0 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   4) there is no 
21ad0 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
21ae0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
21af0 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
21b00 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
21b10 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a  a WAL database,.
21b20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
21b30 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
21b40 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
21b50 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  read..        **
21b60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
21b70 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
21b80 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
21b90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21ba0 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
21bb0 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
21bc0 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
21bd0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
21be0 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
21bf0 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
21c00 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
21c10 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
21c20 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
21c30 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
21c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
21c50 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20  (eOp&0x01)==0   
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
21c90 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
21ca0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
21cd0 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
21ce0 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76  & (bEnd || a==ov
21cf0 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20  flSize)         
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d10 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
21d20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
21d30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
21d40 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21d60 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
21d70 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
21d80 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
21d90 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
21da0 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
21db0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
21dc0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
21dd0 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
21e00 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
21e10 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
21e20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
21e30 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
21e40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
21e50 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
21e60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21e70 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
21e80 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
21e90 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
21ea0 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
21eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
21ec0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
21ed0 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
21ee0 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
21ef0 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
21f00 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
21f10 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
21f20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
21f30 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
21f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21f50 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
21f60 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
21f70 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
21f80 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
21f90 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
21fa0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
21fb0 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
21fc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21fd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21fe0 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
21ff0 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
22000 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
22010 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
22020 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
22030 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
22040 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22050 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
22060 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
22070 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
22080 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
22090 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
220a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
220b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
220c0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
220d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
220e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
220f0 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
22100 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
22110 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22130 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
22140 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22150 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22160 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22170 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
22180 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
22190 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
221a0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
221b0 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
221c0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
221d0 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
221e0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
221f0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
22200 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fset"..**.** The
22210 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
22220 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ure that pCur is
22230 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
22240 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74  alid row.** in t
22250 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
22260 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22270 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
22280 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
22290 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
222a0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
222b0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
222c0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
222d0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
222e0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
222f0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
22300 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
22310 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
22320 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
22330 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
22340 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
22350 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22370 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22380 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
22390 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
223a0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
223b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
223c0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
223d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
223e0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
223f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22400 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
22410 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
22420 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
22430 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
22440 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
22450 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
22460 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
22470 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
22480 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
22490 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
224a0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
224b0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
224c0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
224d0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
224e0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
224f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22500 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
22510 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
22520 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
22530 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
22540 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
22550 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
22560 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
22570 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
22580 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
22590 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
225a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
225b0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
225c0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
225d0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
225e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
225f0 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
22600 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22610 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
22620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22630 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
22640 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
22650 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22660 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
22670 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
22680 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
22690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
226a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
226b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
226c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
226d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
226e0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
226f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22700 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
22710 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
22720 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
22730 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22740 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
22750 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
22760 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
22770 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
22780 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
22790 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
227a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
227b0 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
227c0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
227d0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
227e0 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
227f0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
22800 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
22810 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
22820 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
22830 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70   index btrees (p
22840 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29  Page->intKey==0)
22850 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61   and is the data
22860 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74   for.** table bt
22870 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
22880 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d  Key==1). The num
22890 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
228a0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79  available.** key
228b0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
228c0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
228d0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
228e0 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
228f0 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
22900 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  e a valid pointe
22910 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
22920 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
22930 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
22940 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
22950 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
22960 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
22970 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
22980 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
22990 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
229a0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
229b0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
229c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
229d0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
229e0 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
229f0 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
22a00 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
22a10 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
22a20 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
22a30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
22a40 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
22a50 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
22a60 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
22a70 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
22a80 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
22a90 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
22aa0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
22ab0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
22ac0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
22ad0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
22ae0 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
22af0 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
22b00 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
22b10 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
22b20 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
22b30 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
22b40 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
22b50 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
22b60 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66  ic const void *f
22b70 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
22b80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
22b90 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
22ba0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
22bb0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
22bc0 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20    u32 *pAmt     
22bd0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22be0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
22bf0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
22c00 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  re */.){.  asser
22c10 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
22c20 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
22c30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22c40 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
22c50 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22c60 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
22c80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22c90 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
22ca0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
22cb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22cc0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22cd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22ce0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22cf0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
22d00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
22d10 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
22d20 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
22d30 7a 65 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20  ze>0 );.  *pAmt 
22d40 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
22d50 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  cal;.  return (v
22d60 6f 69 64 2a 29 28 70 43 75 72 2d 3e 69 6e 66 6f  oid*)(pCur->info
22d70 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
22d80 6e 66 6f 2e 6e 48 65 61 64 65 72 29 3b 0a 7d 0a  nfo.nHeader);.}.
22d90 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
22da0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
22db0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
22dc0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
22dd0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
22de0 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
22df0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
22e00 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
22e10 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
22e20 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
22e30 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
22e40 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
22e50 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
22e60 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
22e70 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
22e80 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
22e90 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
22ea0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
22eb0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
22ec0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
22ed0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
22ee0 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
22ef0 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
22f00 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
22f10 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
22f20 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
22f30 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
22f40 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
22f50 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
22f60 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
22f70 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
22f80 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
22f90 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
22fa0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
22fb0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
22fc0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
22fd0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
22fe0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
22ff0 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
23000 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
23010 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
23020 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
23030 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  mt);.}.const voi
23040 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
23050 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
23060 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
23070 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
23080 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
23090 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pAmt);.}.../*.*
230a0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
230b0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
230c0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
230d0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
230e0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
230f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
23100 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
23110 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
23120 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
23130 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
23140 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
23150 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
23160 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
23170 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
23180 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
23190 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
231a0 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
231b0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
231c0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
231d0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
231e0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
231f0 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
23200 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23210 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
23220 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
23230 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
23240 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
23250 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
23260 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
23270 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23280 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
23290 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
232a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
232b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
232c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
232d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
232e0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
232f0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
23300 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
23310 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
23320 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
23330 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
23340 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
23350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23360 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23370 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
23380 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
23390 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
233a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
233b0 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67    (pCur->curFlag
233c0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
233d0 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  ag)==0 ? PAGER_G
233e0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
233f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
23400 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e  urn rc;.  pCur->
23410 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e  apPage[i+1] = pN
23420 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
23430 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a  aiIdx[i+1] = 0;.
23440 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
23450 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
23460 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
23470 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
23480 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
23490 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
234a0 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
234b0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50  nCell<1 || pNewP
234c0 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  age->intKey!=pCu
234d0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e  r->apPage[i]->in
234e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
234f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
23500 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
23510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23520 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50  }..#if 0./*.** P
23530 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
23540 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
23550 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
23560 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
23570 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
23580 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
23590 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
235a0 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
235b0 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
235c0 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
235d0 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
235e0 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
235f0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
23600 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
23610 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
23620 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
23630 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
23640 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
23650 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
23660 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
23670 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
23680 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
23690 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
236a0 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
236b0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
236c0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
236d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
236e0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
236f0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
23700 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
23710 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
23720 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
23730 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
23740 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
23750 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
23760 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
23770 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
23780 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
23790 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
237a0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
237b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
237c0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
237d0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
237e0 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
237f0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
23800 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
23810 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
23820 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
23830 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
23840 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
23850 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
23860 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
23870 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
23880 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
23890 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
238a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
238b0 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
238c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
238d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
238e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
238f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23900 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23910 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
23920 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
23930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23940 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23950 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55  Page] );..  /* U
23960 50 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74  PDATE: It is act
23970 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66  ually possible f
23980 6f 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  or the condition
23990 20 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61   tested by the a
239a0 73 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77  ssert.  ** below
239b0 20 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66   to be untrue if
239c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
239d0 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54  le is corrupt. T
239e0 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66  his can occur if
239f0 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72  .  ** one cursor
23a00 20 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61   has modified pa
23a10 67 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65  ge pParent while
23a20 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
23a30 69 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a  it is held .  **
23a40 20 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72   by a second cur
23a50 73 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f  sor. Which can o
23a60 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20  nly happen if a 
23a70 73 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c  single page is l
23a80 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  inked.  ** into 
23a90 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
23aa0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
23ab0 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
23ac0 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a  base.  */.#if 0.
23ad0 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
23ae0 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
23af0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23b00 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
23b10 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23b20 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
23b30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23b40 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
23b50 0a 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61  .#endif.  testca
23b60 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
23b70 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
23b80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23b90 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
23ba0 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73  ell );..  releas
23bb0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
23bc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
23bd0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  ;.  pCur->iPage-
23be0 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  -;.  pCur->info.
23bf0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
23c00 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
23c10 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
23c20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
23c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
23c40 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
23c50 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
23c60 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
23c70 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
23c80 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
23c90 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
23ca0 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
23cb0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
23cc0 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
23cd0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
23ce0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
23cf0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
23d00 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
23d10 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
23d20 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
23d30 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
23d40 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
23d50 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
23d60 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
23d70 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
23d80 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
23d90 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
23da0 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
23db0 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
23dc0 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
23dd0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
23de0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
23df0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
23e00 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
23e10 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
23e20 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
23e30 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
23e40 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
23e50 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
23e60 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
23e70 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
23e80 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
23e90 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
23ea0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
23eb0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
23ec0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
23ed0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
23ee0 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
23ef0 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
23f00 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
23f10 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
23f20 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
23f30 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
23f40 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
23f50 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
23f60 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
23f70 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
23f80 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
23f90 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
23fa0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
23fb0 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
23fc0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
23fd0 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
23fe0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
23ff0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
24000 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
24010 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
24020 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
24030 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
24040 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
24050 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
24060 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
24070 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24080 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
24090 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
240a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
240b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
240c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
240d0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
240e0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
240f0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
24100 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
24110 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
24120 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
24130 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
24140 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
24150 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
24160 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
24170 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
24180 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
24190 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
241a0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
241b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
241c0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
241d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
241e0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
241f0 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
24200 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
24210 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
24220 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
24230 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
24240 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
24250 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
24260 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
24270 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
24280 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
24290 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
242a0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
242b0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
242c0 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
242d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
242e0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
242f0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
24300 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
24310 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
24320 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c  pCur->apPage[0],
24330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24340 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67    (pCur->curFlag
24350 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
24360 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  ag)==0 ? PAGER_G
24370 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
24380 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
24390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
243a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
243b0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
243c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
243d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
243e0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  >iPage = 0;.  }.
243f0 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
24400 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
24410 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
24420 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
24430 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75   );..  /* If pCu
24440 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
24450 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
24460 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
24470 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
24480 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74  .  ** expected t
24490 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
244a0 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
244b0 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
244c0 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c  Info is.  ** NUL
244d0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
244e0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
244f0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
24500 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
24510 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
24520 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
24530 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  or. .  **.  ** E
24540 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
24550 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65  of SQLite assume
24560 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74  d that this test
24570 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a   could not fail.
24580 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74    ** if the root
24590 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64   page was alread
245a0 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68  y loaded when th
245b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
245c0 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a  called (i.e..  *
245d0 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65  * if pCur->iPage
245e0 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69  >=0). But this i
245f0 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20  s not so if the 
24600 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
24610 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73  upted .  ** in s
24620 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70  uch a way that p
24630 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e  age pRoot is lin
24640 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e  ked into a secon
24650 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a  d b-tree table .
24660 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65    ** (or the fre
24670 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73  elist).  */.  as
24680 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74  sert( pRoot->int
24690 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d  Key==1 || pRoot-
246a0 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
246b0 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  if( pRoot->isIni
246c0 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70  t==0 || (pCur->p
246d0 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f  KeyInfo==0)!=pRo
246e0 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ot->intKey ){.  
246f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24700 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24710 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  }..  pCur->aiIdx
24720 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  [0] = 0;.  pCur-
24730 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
24740 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
24750 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
24760 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  st|BTCF_ValidNKe
24770 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
24780 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  );..  if( pRoot-
24790 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
247a0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
247b0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
247c0 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
247d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
247e0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
247f0 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
24800 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
24810 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24820 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
24830 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
24840 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
24850 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
24860 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
24870 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
24880 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24890 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
248a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
248b0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
248c0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d  SOR_INVALID;.  }
248d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
248e0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
248f0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
24900 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
24910 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
24920 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
24930 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
24940 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
24950 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
24960 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
24970 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
24980 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
24990 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
249a0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
249b0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
249c0 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
249d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
249e0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
249f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24a00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
24a10 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
24a20 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
24a30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
24a40 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24a50 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
24a60 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
24a70 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
24a80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24a90 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
24aa0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
24ab0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24ac0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
24ad0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
24ae0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
24af0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
24b00 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24b10 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
24b20 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
24b30 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
24b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24b50 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
24b60 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
24b70 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
24b80 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
24b90 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
24ba0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
24bb0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
24bc0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
24bd0 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
24be0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
24bf0 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
24c00 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
24c10 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
24c20 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
24c30 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
24c40 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
24c50 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
24c60 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
24c70 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24c80 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
24c90 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
24ca0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
24cb0 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
24cc0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
24cd0 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
24ce0 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
24cf0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
24d00 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
24d10 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
24d20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
24d30 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
24d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
24d50 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
24d60 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
24d70 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24d80 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24d90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24da0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
24db0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
24dc0 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
24dd0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
24de0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
24df0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
24e00 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
24e10 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
24e20 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
24e30 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
24e40 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
24e50 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
24e60 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
24e70 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
24e80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
24ea0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24eb0 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
24ec0 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
24ed0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
24ee0 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
24ef0 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c  ags &= ~BTCF_Val
24f00 69 64 4e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65  idNKey;.  }.  re
24f10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
24f20 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
24f30 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
24f40 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
24f50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24f60 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
24f70 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
24f80 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
24f90 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
24fa0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
24fb0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
24fc0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
24fd0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
24fe0 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
24ff0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25000 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
25010 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
25020 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25030 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25040 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25050 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25060 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25070 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
25080 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
25090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
250a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
250b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
250c0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
250d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
250e0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
250f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25100 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25110 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
25120 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
25130 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
25140 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25150 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25160 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
25170 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
25180 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
25190 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
251a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
251b0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
251c0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
251d0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
251e0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
251f0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
25200 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
25210 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
25220 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
25230 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
25240 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
25250 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
25260 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
25270 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25280 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
25290 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
252a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
252b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
252c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
252d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
252e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
252f0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
25300 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
25310 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
25320 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
25330 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
25340 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
25350 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
25360 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
25370 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
25380 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
25390 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
253a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
253b0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
253c0 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
253d0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
253e0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
253f0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
25400 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
25410 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
25420 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
25430 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
25440 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
25450 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
25460 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25470 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
25480 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
25490 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
254a0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
254b0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
254c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
254d0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
254e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
254f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25500 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
25510 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
25520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25530 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
25540 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
25550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25560 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
25570 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
25580 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
25590 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
255a0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
255b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
255c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
255d0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
255e0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
255f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25600 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25610 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
25620 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
25630 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
25640 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
25650 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
25660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25670 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
25680 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
25690 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
256a0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
256b0 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
256c0 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
256d0 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
256e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
256f0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
25700 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
25710 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
25720 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
25730 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
25740 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
25750 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
25760 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
25770 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
25780 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
25790 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
257a0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
257b0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
257c0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
257d0 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
257e0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
257f0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
25800 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
25810 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
25820 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
25830 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
25840 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
25850 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
25860 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
25870 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
25880 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
25890 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
258a0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
258b0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
258c0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
258d0 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
258e0 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
258f0 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
25900 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
25910 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
25920 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
25930 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
25940 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
25950 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
25960 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
25970 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
25980 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
25990 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
259a0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
259b0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
259c0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
259d0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
259e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
259f0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
25a00 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
25a10 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
25a20 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a40 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
25a50 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
25a60 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
25a70 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
25a80 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
25a90 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
25aa0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
25ab0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
25ac0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
25ad0 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
25ae0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
25af0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
25b00 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
25b10 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25b20 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
25b30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
25b40 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
25b50 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
25b60 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
25b70 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
25b80 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
25b90 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
25ba0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
25bb0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
25bc0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
25bd0 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
25be0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
25bf0 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
25c00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25c10 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
25c20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
25c30 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
25c40 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
25c50 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
25c60 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
25c70 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
25c80 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
25c90 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
25ca0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
25cb0 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
25cc0 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
25cd0 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
25ce0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25cf0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25d00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25d10 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
25d20 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
25d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
25d40 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
25d50 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
25d60 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
25d70 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
25d80 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
25d90 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
25da0 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
25db0 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
25dc0 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
25dd0 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
25de0 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
25df0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
25e00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25e10 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
25e20 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
25e30 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
25e40 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
25e50 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
25e60 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
25e70 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
25e80 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
25e90 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
25ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25eb0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75    }.    if( (pCu
25ec0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
25ed0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26  CF_AtLast)!=0 &&
25ee0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
25ef0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
25f00 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
25f10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25f20 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
25f30 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
25f40 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
25f50 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
25f60 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
25f70 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
25f80 65 79 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20  ey->isCorrupt = 
25f90 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
25fa0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
25fb0 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
25fc0 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
25fd0 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
25fe0 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
25ff0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
26000 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
26010 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
26020 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
26030 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
26040 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
26050 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
26060 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
26070 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
26080 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26090 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
260a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
260b0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
260c0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
260d0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
260e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
260f0 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
26100 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26110 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
26120 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
26130 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26140 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
26150 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
26160 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
26170 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
26180 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
26190 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
261a0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
261b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
261c0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
261d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
261e0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
261f0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
26200 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
26210 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
26220 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
26230 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
26240 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
26250 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26260 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
26270 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
26280 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
262b0 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
262c0 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
262d0 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c    /* pPage->nCel
262e0 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  l must be greate
262f0 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20  r than zero. If 
26300 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74  this is the root
26310 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65  -page.    ** the
26320 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61   cursor would ha
26330 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20  ve been INVALID 
26340 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66  above and this f
26350 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20  or(;;) loop.    
26360 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74  ** not run. If t
26370 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72  his is not the r
26380 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74  oot-page, then t
26390 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29  he moveToChild()
263a0 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
263b0 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  would have alrea
263c0 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63  dy detected db c
263d0 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c  orruption. Simil
263e0 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74  arly, pPage must
263f0 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72  .    ** be the r
26400 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78  ight kind (index
26410 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d   or table) of b-
26420 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72  tree page. Other
26430 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f  wise.    ** a mo
26440 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d  veToChild() or m
26450 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c  oveToRoot() call
26460 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
26470 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e  cted corruption.
26480 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
26490 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
264a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
264b0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70  Page->intKey==(p
264c0 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20  IdxKey==0) );.  
264d0 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
264e0 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
264f0 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l-1;.    assert(
26500 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c   biasRight==0 ||
26510 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b   biasRight==1 );
26520 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e  .    idx = upr>>
26530 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f  (1-biasRight); /
26540 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68  * idx = biasRigh
26550 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75  t ? upr : (lwr+u
26560 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43  pr)/2; */.    pC
26570 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26580 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
26590 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f  x;.    if( xReco
265a0 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a  rdCompare==0 ){.
265b0 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
265c0 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
265d0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65  Key;.        pCe
265e0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
265f0 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
26600 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
26610 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
26620 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
26630 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
26640 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
26650 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
26660 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
26670 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72  ge->aDataEnd ) r
26680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26690 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
266a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
266b0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
266c0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
266d0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
266e0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
266f0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
26700 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
26710 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26720 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
26730 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
26740 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
26750 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
26760 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
26770 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
26780 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
26790 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
267a0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
267b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
267c0 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
267d0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
267e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
267f0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
26800 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
26810 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
26820 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
26830 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
26840 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
26850 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
26860 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
26870 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
26880 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
26890 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
268a0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b  veto_next_layer;
268b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
268c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
268d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
268e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
268f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
26900 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
26910 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
26920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26930 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
26940 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
26950 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
26960 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
26970 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
26980 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26990 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
269a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
269b0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ll;.        pCel
269c0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
269d0 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
269e0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
269f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
26a00 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
26a10 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
26a20 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
26a30 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
26a40 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
26a50 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
26a60 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
26a70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
26a80 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
26a90 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
26aa0 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
26ab0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
26ac0 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
26ad0 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
26ae0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
26af0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
26b00 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
26b10 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
26b20 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
26b30 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
26b40 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
26b50 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
26b60 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
26b70 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
26b80 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
26b90 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
26ba0 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
26bb0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
26bc0 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
26bd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
26be0 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
26bf0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
26c00 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
26c10 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
26c20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
26c30 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
26c40 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
26c50 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
26c60 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
26c70 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
26c80 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
26c90 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
26ca0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
26cb0 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
26cc0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
26cd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
26ce0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
26cf0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
26d00 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
26d10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
26d20 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
26d30 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 2c 20 30  l[1], pIdxKey, 0
26d40 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
26d50 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
26d60 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
26d70 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
26d80 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
26d90 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
26da0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
26db0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26dc0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
26dd0 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
26de0 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
26df0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
26e00 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
26e10 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
26e20 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
26e30 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
26e40 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
26e50 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
26e60 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
26e70 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
26e80 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
26e90 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
26ea0 5d 2c 20 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a  ], pIdxKey, 0);.
26eb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26ed0 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
26ee0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
26ef0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
26f00 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
26f10 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
26f20 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
26f30 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
26f40 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
26f50 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
26f60 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
26f70 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
26f80 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
26f90 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
26fa0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
26fb0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
26fc0 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
26fd0 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  alled. */.      
26fe0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
26ff0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
27000 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
27010 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
27020 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
27030 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  ;.          btre
27040 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
27050 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
27060 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
27070 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
27080 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
27090 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
270a0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
270b0 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20  e3Malloc( nCell 
270c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
270d0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
270e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
270f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27100 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27110 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
27120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27130 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
27140 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
27150 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
27160 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
27170 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
27180 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
27190 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
271a0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   2);.          i
271b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
271c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
271d0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
271e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
271f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
27200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27210 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
27220 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
27230 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 2c 20  llKey, pIdxKey, 
27240 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
27250 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
27260 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Key);.        }.
27270 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27280 70 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72 72 75  pIdxKey->isCorru
27290 70 74 3d 3d 30 20 7c 7c 20 63 3d 3d 30 20 29 3b  pt==0 || c==0 );
272a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
272b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
272c0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
272d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
272e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
272f0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
27300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27310 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
27320 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
27330 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
27340 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
27350 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
27360 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27370 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
27380 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27390 70 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72 72 75  pIdxKey->isCorru
273a0 70 74 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  pt ) rc = SQLITE
273b0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
273c0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
273d0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
273e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
273f0 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
27400 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
27410 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
27420 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
27430 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
27440 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
27450 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
27460 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
27470 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
27480 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
27490 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
274a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
274b0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
274c0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
274d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
274e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
274f0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27500 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27510 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
27520 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27530 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
27540 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
27550 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
27560 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27570 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27580 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
27590 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
275a0 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
275b0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
275c0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
275d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
275e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
275f0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
27600 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
27610 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
27620 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
27630 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
27640 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27650 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
27660 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
27670 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
27680 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
27690 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
276a0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
276b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
276c0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
276d0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
276e0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
276f0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
27700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
27710 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
27720 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
27730 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
27740 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
27750 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
27760 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
27770 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
27780 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
27790 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
277a0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
277b0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
277c0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
277d0 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
277e0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
277f0 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
27800 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
27810 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
27820 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
27830 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
27840 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
27850 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
27860 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
27870 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
27880 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
27890 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
278a0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
278b0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
278c0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
278d0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
278e0 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
278f0 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
27900 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
27910 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
27920 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
27930 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
27940 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
27950 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
27960 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
27970 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
27980 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
27990 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
279a0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
279b0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
279c0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
279d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
279e0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
279f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
27a00 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
27a10 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
27a20 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
27a30 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
27a40 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
27a50 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
27a60 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
27a70 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
27a80 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
27a90 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
27aa0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
27ab0 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
27ac0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
27ad0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
27ae0 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
27af0 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
27b00 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
27b10 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
27b20 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
27b30 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
27b40 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
27b50 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
27b60 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
27b70 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
27b80 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
27b90 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
27ba0 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
27bb0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
27bc0 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
27bd0 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
27be0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
27bf0 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
27c00 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
27c10 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
27c20 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
27c30 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
27c40 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  er.).*/.int sqli
27c50 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
27c60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
27c70 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
27c80 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
27c90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
27ca0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27cb0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27cc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27cd0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
27ce0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
27cf0 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
27d00 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
27d10 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
27d20 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
27d30 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
27d40 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
27d50 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
27d60 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
27d70 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
27d80 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
27d90 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
27da0 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
27db0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27dc0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
27dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
27de0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
27df0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
27e00 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
27e10 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
27e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27e30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
27e40 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
27e50 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
27e60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27e70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27e80 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
27e90 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
27ea0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
27eb0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27ec0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
27ed0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
27ee0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
27ef0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
27f00 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
27f10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
27f20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
27f40 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
27f50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
27f60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27f70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
27f80 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
27f90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27fa0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
27fb0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
27fc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
27fd0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
27fe0 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
27ff0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
28000 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
28010 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
28020 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
28030 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
28040 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
28050 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
28060 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
28070 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
28080 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
28090 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
280a0 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
280b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
280c0 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
280d0 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
280e0 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
280f0 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
28100 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
28110 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
28120 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
28130 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
28140 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
28150 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
28160 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
28170 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
28180 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 69 64 78  Ovfl);.  if( idx
28190 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
281a0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
281b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
281c0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
281d0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
281e0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
281f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
28200 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
28210 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  c ){.        *pR
28220 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
28230 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28240 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f   }.      rc = mo
28250 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
28260 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
28270 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
28280 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28290 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
282a0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
282b0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
282c0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
282d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
282e0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
282f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28300 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
28310 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
28320 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
28330 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28340 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28350 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
28360 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28370 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
28380 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
28390 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
283a0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
283b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
283c0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
283d0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
283e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
283f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
28400 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
28410 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
28420 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
28430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28440 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
28450 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
28460 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
28470 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
28480 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
28490 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
284a0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
284b0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
284c0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
284d0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
284e0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
284f0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
28500 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
28510 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
28520 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28530 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
28540 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
28550 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
28560 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
28570 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
28580 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
28590 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
285a0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
285b0 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
285c0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
285d0 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
285e0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
285f0 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
28600 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
28610 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
28620 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
28630 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
28640 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
28650 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
28660 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
28670 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
28680 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
28690 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
286a0 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
286b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
286c0 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
286d0 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
286e0 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
286f0 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
28700 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
28710 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
28720 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
28730 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
28740 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
28750 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
28760 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
28770 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
28780 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
28790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
287a0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
287b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
287c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
287d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
287e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
287f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
28800 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28810 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
28820 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
28830 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
28840 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
28850 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
28860 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
28870 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
28880 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28890 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
288a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
288b0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
288c0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
288d0 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  ){.    if( ALWAY
288e0 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  S(pCur->eState>=
288f0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28900 45 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EK) ){.      rc 
28910 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
28920 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
28930 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
28940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28950 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
28960 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
28970 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
28980 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
28990 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
289a0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
289b0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
289c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
289d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
289e0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
289f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
28a00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28a10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
28a20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28a30 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
28a40 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
28a50 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
28a60 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
28a70 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
28a80 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
28a90 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
28aa0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28ab0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
28ad0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
28ae0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
28af0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
28b00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
28b10 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
28b20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
28b30 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
28b40 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
28b50 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
28b60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28b70 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
28b80 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
28b90 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
28ba0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
28bb0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
28bc0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28bd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
28bf0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
28c00 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
28c10 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
28c20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28c30 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
28c40 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
28c50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
28c60 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28c70 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28c80 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
28c90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
28cb0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
28cc0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
28cd0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66   }.    pCur->inf
28ce0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
28cf0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
28d00 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
28d10 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
28d20 66 6c 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  fl);..    pCur->
28d30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28d40 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
28d50 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
28d60 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
28d70 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
28d80 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
28d90 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
28da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
28db0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
28dc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28de0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
28df0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
28e00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28e10 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
28e20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
28e30 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
28e40 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
28e50 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
28e60 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
28e70 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
28e80 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
28e90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
28ea0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
28eb0 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
28ec0 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
28ed0 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
28ee0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
28ef0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
28f00 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
28f10 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
28f20 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
28f30 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
28f40 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
28f50 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
28f60 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
28f70 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
28f80 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
28f90 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
28fa0 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
28fb0 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
28fc0 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
28fd0 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
28fe0 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
28ff0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29000 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
29010 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
29020 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
29030 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
29040 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
29050 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
29060 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
29070 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
29080 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
29090 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
290a0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
290b0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
290c0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
290d0 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
290e0 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
290f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29100 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
29110 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
29120 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
29130 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
29140 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
29150 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
29160 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
29170 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
29180 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
29190 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
291a0 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
291b0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
291c0 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
291d0 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
291e0 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
291f0 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
29200 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
29210 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
29220 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
29230 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
29240 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
29250 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
29260 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
29270 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
29280 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
29290 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
292a0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
292b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
292c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
292d0 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
292e0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
292f0 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
29300 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
29310 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
29320 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
29330 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
29340 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
29350 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
29360 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
29370 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
29380 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
29390 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
293a0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
293b0 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
293c0 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
293d0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
293e0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
293f0 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
29400 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
29410 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
29420 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
29430 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
29440 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
29450 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
29460 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
29470 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
29480 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
29490 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
294a0 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
294b0 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
294c0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
294d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
294e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
294f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
29500 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
29510 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
29520 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
29530 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
29540 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
29550 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
29560 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
29570 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
29580 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
29590 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
295a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
295b0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
295c0 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
295d0 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
295e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
295f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29600 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
29610 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
29620 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
29630 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
29640 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
29650 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
29660 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
29670 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
29680 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
29690 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
296a0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
296b0 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
296c0 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
296d0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
296e0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
296f0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
29700 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
29710 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
29720 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
29730 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
29740 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
29750 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
29760 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
29770 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
29780 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29790 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
297a0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
297b0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
297c0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
297d0 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
297e0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
297f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
29800 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
29810 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
29820 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
29830 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
29840 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
29850 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
29860 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
29870 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
29880 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
29890 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
298a0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
298b0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
298c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
298d0 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
298e0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
298f0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
29900 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
29910 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
29920 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
29930 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
29940 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
29950 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
29960 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
29970 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
29980 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
29990 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
299a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
299b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
299c0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
299d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
299e0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
299f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29a00 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
29a10 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
29a20 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
29a30 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
29a40 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
29a50 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
29a60 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
29a70 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
29a80 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
29a90 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
29aa0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
29ab0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
29ac0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
29ad0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
29ae0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
29af0 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
29b00 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
29b10 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
29b20 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
29b30 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
29b40 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
29b50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
29b60 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
29b70 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
29b80 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
29b90 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
29ba0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
29bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29bc0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
29bd0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29be0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
29bf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29c00 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
29c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
29c20 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
29c30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29c40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29c50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29c60 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
29c70 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
29c80 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
29c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29ca0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
29cb0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
29cc0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
29cd0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
29ce0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
29cf0 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
29d00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
29d10 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
29d20 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  ;..      k = get
29d30 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
29d40 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f  Data[4]); /* # o
29d50 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73  f leaves on this
29d60 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
29d70 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
29d80 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
29d90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
29da0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
29db0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
29dc0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
29dd0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
29de0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
29df0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
29e00 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
29e10 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
29e20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
29e30 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
29e40 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
29e50 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
29e60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29e70 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
29e80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29e90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
29ea0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
29eb0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
29ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29ed0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
29ee0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
29ef0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
29f00 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
29f10 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
29f20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
29f30 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
29f40 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
29f50 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
29f60 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
29f70 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
29f80 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
29f90 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
29fa0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
29fb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
29fc0 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
29fd0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
29fe0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
29ff0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2a000 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2a010 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2a020 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2a030 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2a040 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2a050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2a060 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2a070 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2a080 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2a090 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2a0a0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2a0b0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2a0c0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2a0d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2a0e0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2a0f0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2a100 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2a110 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2a120 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2a130 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2a140 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2a150 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2a160 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2a170 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2a180 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2a190 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2a1a0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2a1b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a1c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2a1d0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2a1e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2a1f0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2a200 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2a210 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2a220 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2a230 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2a240 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2a250 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2a260 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2a270 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2a280 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2a290 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a2a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2a2b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a2c0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2a2d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2a2e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a2f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a300 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a310 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2a320 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a330 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2a340 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2a350 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2a360 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2a370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a390 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2a3a0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2a3b0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2a3c0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2a3d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2a3e0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2a3f0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2a400 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2a410 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2a420 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2a430 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2a440 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2a450 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2a460 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2a470 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2a480 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2a490 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2a4a0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2a4b0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2a4c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2a4d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2a4e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2a4f0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2a500 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2a510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2a520 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2a530 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2a540 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2a550 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2a560 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
2a570 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2a580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a5a0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2a5b0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2a5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a5d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a5e0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
2a5f0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2a600 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2a610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a620 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2a630 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2a640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2a650 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2a660 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2a670 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
2a680 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2a690 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2a6a0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2a6b0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2a6c0 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
2a6d0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2a6e0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2a6f0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2a700 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
2a710 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
2a720 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
2a730 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2a740 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2a750 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2a760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2a770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2a780 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2a790 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
2a7a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2a7b0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2a7c0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
2a7d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2a7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a7f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a800 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2a810 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2a820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a830 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2a840 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a850 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2a860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a870 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2a880 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2a890 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
2a8a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
2a8b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a8c0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2a8d0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2a8e0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2a8f0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2a900 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2a910 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
2a920 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a930 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
2a940 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
2a950 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
2a960 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
2a970 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
2a980 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
2a990 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2a9a0 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
2a9b0 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
2a9c0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
2a9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
2a9e0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
2a9f0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2aa00 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2aa10 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2aa20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2aa30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2aa40 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
2aa50 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2aa60 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
2aa70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
2aa80 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2aaa0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2aac0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2aad0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2aae0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2aaf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2ab00 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
2ab10 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
2ab20 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2ab30 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
2ab40 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2ab50 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2ab60 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2ab70 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
2ab80 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2ab90 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2aba0 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
2abb0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2abc0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
2abd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2abe0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
2ac00 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
2ac10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ac20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ac30 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2ac40 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
2ac50 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2ac60 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
2ac70 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2ac80 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2ac90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2aca0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2acb0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2acc0 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
2acd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2ace0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2acf0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2ad00 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2ad10 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2ad20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2ad30 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2ad40 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2ad50 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
2ad60 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
2ad70 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
2ad80 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
2ad90 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2ada0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
2adb0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
2adc0 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
2add0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
2ade0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
2adf0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
2ae00 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
2ae10 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ae30 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
2ae40 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
2ae50 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2ae60 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
2ae70 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
2ae80 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
2ae90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2aea0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2aeb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2aec0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2aed0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2aee0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2aef0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
2af00 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2af10 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
2af20 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
2af30 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
2af40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2af50 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
2af60 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2af70 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
2af80 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
2af90 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
2afa0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ) ? PAGER_GET_NO
2afb0 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20  CONTENT : 0;.   
2afc0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2afd0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
2afe0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
2aff0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2b000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b020 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b030 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2b040 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2b050 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b060 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b080 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2b090 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2b0a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2b0b0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
2b0c0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
2b0d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2b0e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2b0f0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
2b100 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
2b110 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
2b120 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
2b130 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
2b140 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
2b150 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
2b160 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
2b170 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
2b180 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
2b190 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b1a0 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
2b1b0 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
2b1c0 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
2b1d0 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
2b1e0 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
2b1f0 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
2b200 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
2b210 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
2b220 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
2b230 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
2b240 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
2b250 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
2b260 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
2b270 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
2b280 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2b290 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
2b2a0 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
2b2b0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
2b2c0 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
2b2d0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
2b2e0 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
2b2f0 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
2b300 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
2b310 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
2b320 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
2b330 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
2b340 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
2b350 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
2b360 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
2b370 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
2b380 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
2b390 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
2b3a0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2b3b0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
2b3c0 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
2b3d0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
2b3e0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2b3f0 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
2b400 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
2b410 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
2b420 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
2b430 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
2b440 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
2b450 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
2b460 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
2b470 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
2b480 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
2b490 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
2b4a0 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
2b4b0 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
2b4c0 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
2b4d0 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
2b4e0 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
2b4f0 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
2b500 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
2b510 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
2b520 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
2b530 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b540 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
2b550 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
2b560 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
2b570 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 20  ->bDoTruncate)) 
2b580 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
2b590 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20 20 20 20  NTENT : 0;..    
2b5a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b5b0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
2b5c0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2b5d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2b5e0 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
2b5f0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
2b600 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
2b610 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2b620 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
2b630 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
2b640 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2b650 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
2b660 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
2b670 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
2b680 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
2b690 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
2b6a0 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
2b6b0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2b6c0 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
2b6d0 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
2b6e0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2b6f0 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
2b700 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
2b710 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
2b720 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
2b730 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
2b740 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
2b750 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
2b760 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2b770 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
2b780 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
2b790 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2b7a0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2b7b0 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
2b7c0 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
2b7d0 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
2b7e0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2b7f0 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
2b800 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2b810 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
2b820 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2b830 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
2b840 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2b850 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b880 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
2b890 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2b8a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
2b8b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b8c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b8d0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
2b8e0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
2b8f0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2b900 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2b910 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
2b920 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
2b930 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
2b940 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
2b950 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
2b960 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
2b970 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
2b980 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
2b990 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2b9a0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2b9b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
2b9c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2b9d0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
2b9e0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
2b9f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ba00 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
2ba10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2ba20 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2ba30 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2ba40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ba50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2ba60 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
2ba70 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2ba80 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2ba90 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
2baa0 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
2bab0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2bac0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2bad0 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
2bae0 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
2baf0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2bb00 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2bb10 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2bb20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bb30 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
2bb40 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2bb50 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
2bb60 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
2bb70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2bb80 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
2bb90 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
2bba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bbb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2bbc0 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
2bbd0 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
2bbe0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2bbf0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
2bc00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2bc10 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
2bc20 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2bc30 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2bc40 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
2bc50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2bc60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2bc70 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
2bc80 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
2bc90 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
2bca0 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
2bcb0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2bcc0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2bcd0 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
2bce0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
2bcf0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
2bd00 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2bd10 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
2bd20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2bd30 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
2bd40 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
2bd50 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
2bd60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
2bd70 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
2bd80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2bd90 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
2bda0 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
2bdb0 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
2bdc0 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
2bdd0 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
2bde0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
2bdf0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2be00 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
2be10 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
2be20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
2be30 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
2be40 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
2be50 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
2be60 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2be70 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
2be80 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
2be90 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
2bea0 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
2beb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2bec0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2bed0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
2bee0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2bef0 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
2bf00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2bf10 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2bf20 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
2bf30 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2bf40 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
2bf50 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2bf60 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
2bf70 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
2bf80 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
2bf90 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bfb0 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
2bfc0 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
2bfd0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bff0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2c000 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2c010 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
2c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c030 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2c040 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
2c050 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
2c060 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2c070 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2c080 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2c090 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
2c0a0 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
2c0b0 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
2c0c0 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
2c0d0 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
2c0e0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
2c0f0 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
2c100 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
2c110 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
2c120 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
2c130 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2c140 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2c150 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
2c160 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
2c170 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
2c180 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2c190 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2c1a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2c1b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
2c1c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
2c1d0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
2c1e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2c1f0 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
2c200 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2c210 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
2c220 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
2c230 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
2c240 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
2c250 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
2c260 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
2c270 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
2c280 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
2c290 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
2c2a0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
2c2b0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
2c2c0 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
2c2d0 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
2c2e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2c2f0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2c300 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
2c310 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
2c320 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c330 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2c340 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
2c350 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2c360 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2c370 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
2c380 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
2c390 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
2c3a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2c3b0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2c3c0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2c3d0 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
2c3e0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
2c3f0 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
2c400 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
2c410 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
2c420 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2c430 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
2c440 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
2c450 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
2c460 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
2c470 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2c480 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
2c490 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
2c4a0 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
2c4b0 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
2c4c0 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
2c4d0 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
2c4e0 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
2c4f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2c500 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
2c510 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
2c520 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
2c530 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2c540 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
2c550 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
2c560 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
2c570 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
2c580 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
2c590 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
2c5a0 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
2c5b0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2c5c0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
2c5d0 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
2c5e0 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
2c5f0 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
2c600 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2c610 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
2c620 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
2c630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
2c640 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
2c650 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
2c660 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2c670 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
2c680 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
2c690 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
2c6a0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2c6b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2c6c0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
2c6d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2c6e0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2c6f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2c700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c710 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2c720 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
2c730 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
2c740 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2c750 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
2c760 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2c770 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
2c780 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
2c790 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2c7a0 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
2c7b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c7c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2c7d0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2c7e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
2c7f0 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
2c800 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2c810 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
2c820 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2c830 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
2c840 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
2c850 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
2c860 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
2c870 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
2c880 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2c890 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2c8a0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
2c8b0 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
2c8c0 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
2c8d0 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2c8e0 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
2c8f0 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
2c900 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2c910 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
2c920 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
2c930 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2c940 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
2c950 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
2c960 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
2c970 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
2c980 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
2c990 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
2c9a0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
2c9b0 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2c9c0 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
2c9d0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
2c9e0 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
2c9f0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
2ca00 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
2ca10 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
2ca20 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
2ca30 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
2ca40 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
2ca50 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
2ca60 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
2ca70 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
2ca80 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
2ca90 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
2caa0 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
2cab0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
2cac0 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
2cad0 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
2cae0 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
2caf0 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
2cb00 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
2cb10 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
2cb20 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
2cb30 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
2cb40 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
2cb50 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
2cb60 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
2cb70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2cb80 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2cb90 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2cba0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cbb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cbc0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2cbd0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
2cbe0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
2cbf0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
2cc00 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
2cc10 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
2cc20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
2cc30 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2cc40 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
2cc50 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
2cc60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2cc70 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
2cc80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2cc90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2cca0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
2ccb0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
2ccc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ccd0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2cce0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
2ccf0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
2cd00 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
2cd10 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
2cd20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2cd30 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
2cd40 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
2cd50 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
2cd60 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
2cd70 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2cd80 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
2cd90 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
2cda0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
2cdb0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
2cdc0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2cdd0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
2cde0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2cdf0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
2ce00 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
2ce10 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
2ce20 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
2ce30 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2ce40 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
2ce50 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
2ce60 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
2ce70 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
2ce80 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
2ce90 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2cea0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
2ceb0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
2cec0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
2ced0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2cee0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
2cef0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
2cf00 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2cf10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2cf20 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2cf30 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2cf40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2cf50 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
2cf60 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
2cf70 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
2cf80 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
2cf90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2cfa0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
2cfb0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2cfc0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
2cfd0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
2cfe0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
2cff0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
2d000 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
2d010 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
2d020 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
2d030 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
2d040 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
2d050 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2d060 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2d070 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
2d080 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
2d090 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2d0a0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
2d0b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2d0c0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
2d0d0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
2d0e0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
2d0f0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
2d100 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
2d110 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
2d120 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
2d130 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2d140 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2d150 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
2d160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2d170 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
2d180 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
2d190 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
2d1a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2d1b0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
2d1c0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2d1d0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
2d1e0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
2d1f0 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
2d200 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
2d210 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2d220 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2d230 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2d240 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2d250 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2d260 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
2d270 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
2d280 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d290 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
2d2a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2d2b0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
2d2c0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
2d2d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
2d2e0 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b  +info.iOverflow+
2d2f0 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  3 > pPage->aData
2d300 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
2d310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d320 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2d330 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  PT;  /* Cell ext
2d340 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
2d350 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f   page */.  }.  o
2d360 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
2d370 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
2d380 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
2d390 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2d3a0 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
2d3b0 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
2d3c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2d3d0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
2d3e0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
2d3f0 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
2d400 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
2d410 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
2d420 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
2d430 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
2d440 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
2d450 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
2d460 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
2d470 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2d480 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
2d490 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
2d4a0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2d4b0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
2d4c0 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
2d4d0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
2d4e0 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
2d4f0 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
2d500 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
2d510 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
2d520 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
2d530 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
2d540 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
2d550 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2d560 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
2d570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d580 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2d590 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
2d5a0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
2d5b0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
2d5c0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
2d5d0 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
2d5e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2d5f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2d600 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
2d610 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
2d620 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
2d630 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
2d640 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
2d650 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2d660 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
2d670 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
2d680 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2d690 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
2d6a0 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
2d6b0 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
2d6c0 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
2d6d0 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
2d6e0 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
2d6f0 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
2d700 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
2d710 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
2d720 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
2d730 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
2d740 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
2d750 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
2d760 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
2d770 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
2d780 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
2d790 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
2d7a0 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
2d7b0 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
2d7c0 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
2d7d0 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
2d7e0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
2d7f0 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
2d800 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
2d810 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
2d820 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
2d830 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2d840 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
2d850 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
2d860 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
2d870 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
2d880 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
2d890 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
2d8a0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
2d8b0 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
2d8c0 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
2d8d0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
2d8e0 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
2d8f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d900 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2d910 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
2d920 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2d930 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
2d940 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
2d950 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2d960 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
2d970 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2d980 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
2d990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d9a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2d9b0 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
2d9c0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
2d9d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d9e0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
2d9f0 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
2da00 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
2da10 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
2da20 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
2da30 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
2da40 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
2da50 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
2da60 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
2da70 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
2da80 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
2da90 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
2daa0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
2dab0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2dac0 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
2dad0 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
2dae0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
2daf0 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
2db00 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2db10 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
2db20 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
2db30 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
2db40 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
2db50 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
2db60 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
2db70 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
2db80 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
2db90 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
2dba0 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
2dbb0 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
2dbc0 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
2dbd0 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
2dbe0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2dbf0 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
2dc00 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2dc20 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
2dc30 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
2dc40 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2dc50 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
2dc60 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
2dc70 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
2dc80 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2dc90 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2dca0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
2dcb0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2dcc0 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
2dcd0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
2dce0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
2dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd00 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
2dd10 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2dd20 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
2dd30 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dd50 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
2dd60 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2dd70 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
2dd80 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
2dd90 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
2dda0 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
2ddb0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
2ddc0 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
2ddd0 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
2dde0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
2ddf0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
2de00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
2de10 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
2de20 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2de30 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
2de40 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
2de50 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
2de60 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
2de70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2de80 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2de90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
2dea0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
2deb0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
2dec0 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
2ded0 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
2dee0 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
2def0 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
2df00 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
2df10 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
2df20 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
2df30 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
2df40 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
2df50 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2df60 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2df70 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2df80 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2df90 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2dfa0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2dfb0 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
2dfc0 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
2dfd0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2dfe0 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
2dff0 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
2e000 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
2e010 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
2e020 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
2e030 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
2e040 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
2e050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
2e060 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
2e070 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
2e080 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
2e090 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
2e0a0 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65  *)&nKey);.  btre
2e0b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2e0c0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
2e0d0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
2e0e0 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
2e0f0 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
2e100 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
2e110 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2e120 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28  fo.nData==(u32)(
2e130 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a  nData+nZero) );.
2e140 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
2e150 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
2e160 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
2e170 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
2e180 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2e190 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
2e1a0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
2e1b0 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
2e1c0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
2e1d0 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
2e1e0 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
2e1f0 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
2e200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e210 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2e220 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2e230 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
2e240 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
2e250 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
2e260 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
2e270 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
2e280 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
2e290 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
2e2a0 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
2e2b0 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
2e2c0 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
2e2d0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
2e2e0 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
2e2f0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
2e300 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
2e310 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e320 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2e330 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
2e340 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
2e350 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
2e360 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2e370 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
2e380 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2e390 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
2e3a0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
2e3b0 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
2e3c0 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
2e3d0 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
2e3e0 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
2e3f0 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
2e400 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2e410 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
2e420 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2e430 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
2e440 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2e450 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
2e460 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
2e470 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
2e480 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e490 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
2e4a0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2e4b0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2e4c0 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
2e4d0 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
2e4e0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2e4f0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
2e500 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
2e510 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
2e520 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
2e530 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
2e540 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
2e550 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
2e560 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
2e570 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
2e580 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
2e590 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
2e5a0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
2e5b0 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
2e5c0 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
2e5d0 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
2e5e0 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
2e5f0 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
2e600 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
2e610 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
2e620 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
2e630 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
2e640 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
2e650 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
2e660 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
2e670 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
2e680 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2e690 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
2e6a0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2e6b0 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
2e6c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e6d0 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
2e6e0 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
2e6f0 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
2e700 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
2e710 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
2e720 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
2e730 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
2e740 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
2e750 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e760 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2e770 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
2e780 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
2e790 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2e7a0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2e7b0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2e7c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e7d0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
2e7e0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2e7f0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2e800 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
2e810 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2e820 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
2e830 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2e840 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2e850 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2e860 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2e870 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2e880 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2e890 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2e8a0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2e8b0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2e8c0 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
2e8d0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2e8e0 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2e8f0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2e900 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
2e910 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2e920 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
2e930 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
2e940 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
2e950 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
2e960 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2e970 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2e980 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2e990 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2e9a0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2e9b0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2e9c0 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
2e9d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e9e0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2e9f0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
2ea00 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
2ea10 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
2ea20 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
2ea30 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
2ea40 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
2ea50 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
2ea60 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
2ea70 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2ea80 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
2ea90 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
2eaa0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
2eab0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
2eac0 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
2ead0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
2eae0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
2eaf0 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
2eb00 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2eb10 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
2eb20 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
2eb30 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
2eb40 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2eb50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
2eb60 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
2eb70 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2eb80 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
2eb90 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2eba0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
2ebb0 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
2ebc0 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
2ebd0 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
2ebe0 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
2ebf0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
2ec00 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
2ec10 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
2ec20 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
2ec30 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
2ec40 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2ec50 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2ec60 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2ec70 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2ec80 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2ec90 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
2eca0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
2ecb0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
2ecc0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
2ecd0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
2ece0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
2ecf0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2ed00 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
2ed10 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
2ed20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2ed30 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
2ed40 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
2ed50 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
2ed60 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
2ed70 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
2ed80 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
2ed90 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
2eda0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
2edb0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
2edc0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2edd0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
2ede0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2edf0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
2ee00 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
2ee10 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
2ee20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
2ee30 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
2ee40 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2ee50 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
2ee60 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
2ee70 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
2ee80 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
2ee90 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
2eea0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
2eeb0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
2eec0 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
2eed0 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
2eee0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
2eef0 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
2ef00 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
2ef10 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2ef20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
2ef30 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
2ef40 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2ef50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
2ef60 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
2ef70 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
2ef80 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2ef90 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
2efa0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
2efb0 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
2efc0 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
2efd0 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
2efe0 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
2eff0 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
2f000 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
2f010 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2f020 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
2f030 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
2f040 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
2f050 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
2f060 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
2f070 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
2f080 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
2f090 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2f0a0 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2f0b0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
2f0c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2f0d0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
2f0e0 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
2f0f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2f100 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2f110 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2f120 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
2f130 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2f140 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2f150 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
2f160 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2f170 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67  a;.  ptr = &pPag
2f180 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64  e->aCellIdx[2*id
2f190 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
2f1a0 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20  yte(ptr);.  hdr 
2f1b0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2f1c0 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  et;.  testcase( 
2f1d0 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  pc==get2byte(&da
2f1e0 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
2f1f0 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
2f200 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
2f210 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
2f220 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62   pc < (u32)get2b
2f230 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2f240 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
2f250 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2f260 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
2f270 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2f280 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
2f290 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
2f2a0 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
2f2b0 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
2f2c0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
2f2d0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2f2e0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
2f2f0 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70  l--;.  memmove(p
2f300 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
2f310 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
2f320 29 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  ));.  put2byte(&
2f330 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
2f340 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
2f350 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
2f360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2f370 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
2f380 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
2f390 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
2f3a0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
2f3b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
2f3c0 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
2f3d0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
2f3e0 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
2f3f0 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
2f400 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
2f410 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
2f420 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
2f430 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
2f440 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
2f450 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
2f460 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
2f470 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
2f480 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
2f490 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
2f4a0 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
2f4b0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
2f4c0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2f4d0 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
2f4e0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
2f4f0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
2f500 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
2f510 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
2f520 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
2f530 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
2f540 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
2f550 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
2f560 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
2f570 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
2f580 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2f590 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
2f5a0 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
2f5b0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
2f5c0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
2f5d0 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
2f5e0 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
2f5f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2f600 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
2f610 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2f620 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
2f630 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
2f640 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
2f650 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
2f660 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
2f670 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
2f680 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
2f690 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
2f6a0 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
2f6b0 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
2f6c0 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
2f6d0 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
2f6e0 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
2f6f0 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
2f700 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
2f710 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
2f720 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2f730 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
2f740 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
2f750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2f760 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
2f770 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
2f780 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
2f790 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
2f7a0 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
2f7b0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
2f7c0 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
2f7d0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
2f7e0 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
2f7f0 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
2f800 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
2f810 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
2f820 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
2f830 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2f840 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2f850 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
2f860 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
2f870 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
2f880 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
2f890 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
2f8a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2f8b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  er */.  int end;
2f8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2f8d0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
2f8e0 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
2f8f0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2f900 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
2f910 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
2f920 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
2f930 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
2f940 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
2f950 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
2f960 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
2f970 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
2f980 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2f990 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2f9a0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
2f9b0 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
2f9c0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b  age */.  int nSk
2f9d0 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34  ip = (iChild ? 4
2f9e0 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70   : 0);..  if( *p
2f9f0 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
2fa00 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
2fa10 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
2fa20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2fa30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58   );.  assert( MX
2fa40 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2fa50 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73  )<=10921 );.  as
2fa60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2fa70 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2fa80 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55  e->pBt) || CORRU
2fa90 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
2faa0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2fab0 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
2fac0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b  Page->apOvfl) );
2fad0 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
2fae0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
2faf0 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70  fl)==ArraySize(p
2fb00 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b  Page->aiOvfl) );
2fb10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2fb20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2fb30 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2fb40 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
2fb50 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
2fb60 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
2fb70 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
2fb80 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
2fb90 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
2fba0 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
2fbb0 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
2fbc0 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
2fbd0 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
2fbe0 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
2fbf0 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
2fc00 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
2fc10 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
2fc20 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
2fc30 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
2fc40 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
2fc50 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
2fc60 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
2fc70 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
2fc80 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
2fc90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2fca0 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
2fcb0 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
2fcc0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2fcd0 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
2fce0 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
2fcf0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
2fd00 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
2fd10 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
2fd20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
2fd30 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2fd40 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
2fd50 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2fd60 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
2fd70 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
2fd80 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2fd90 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
2fda0 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
2fdb0 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
2fdc0 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
2fdd0 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
2fde0 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
2fdf0 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
2fe00 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
2fe10 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
2fe20 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
2fe30 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
2fe40 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
2fe50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2fe60 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2fe70 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2fe80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2fe90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fea0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2feb0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2fec0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
2fed0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2fee0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2fef0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2ff00 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
2ff10 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
2ff20 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
2ff30 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
2ff40 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
2ff50 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2ff60 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
2ff70 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
2ff80 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2ff90 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
2ffa0 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
2ffb0 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
2ffc0 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
2ffd0 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
2ffe0 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
2fff0 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
30000 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
30010 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
30020 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
30030 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
30040 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
30050 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
30060 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
30070 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
30080 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
30090 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
300a0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
300b0 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
300c0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
300d0 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
300e0 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
300f0 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  p);.    if( iChi
30100 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
30110 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
30120 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
30130 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
30140 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b  a[ins+2], &data[
30150 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a  ins], end-ins);.
30160 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
30170 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
30180 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
30190 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
301a0 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
301b0 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
301c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
301d0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
301e0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
301f0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
30200 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
30210 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
30220 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
30230 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
30240 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
30250 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
30260 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
30270 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
30280 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
30290 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
302a0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52  pPage, pCell, pR
302b0 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
302c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
302d0 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
302e0 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
302f0 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
30300 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
30310 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
30320 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
30330 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
30340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30350 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
30360 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
30370 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
30380 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
30390 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
303a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
303b0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
303c0 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
303d0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
303e0 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
303f0 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
30400 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
30410 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
30420 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
30430 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
30440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
30450 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
30460 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20  u8 *pCellptr;   
30470 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
30480 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
30490 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
304a0 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
304b0 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
304c0 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20   body */.  u8 * 
304d0 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
304e0 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
304f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
30500 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
30510 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
30520 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
30530 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
30540 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
30550 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67  f header on pPag
30560 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
30570 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65   nUsable = pPage
30580 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
30590 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a  e; /* Usable siz
305a0 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20  e of page */..  
305b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
305c0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
305d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
305e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
305f0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
30600 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
30610 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28  l>=0 && nCell<=(
30620 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67  int)MX_CELL(pPag
30630 65 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20  e->pBt).        
30640 20 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43      && (int)MX_C
30650 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
30660 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72  =10921);.  asser
30670 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
30680 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
30690 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
306a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
306b0 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74  he page has just
306c0 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20   been zeroed by 
306d0 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20  zeroPage() */.  
306e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
306f0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
30700 65 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74  ert( get2byteNot
30710 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
30720 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a  ])==nUsable );..
30730 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50    pCellptr = &pP
30740 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43  age->aCellIdx[nC
30750 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f  ell*2];.  cellbo
30760 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20  dy = nUsable;.  
30770 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69  for(i=nCell-1; i
30780 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75  >=0; i--){.    u
30790 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d  16 sz = aSize[i]
307a0 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d  ;.    pCellptr -
307b0 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64  = 2;.    cellbod
307c0 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74  y -= sz;.    put
307d0 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
307e0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
307f0 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
30800 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
30810 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74  , sz);.  }.  put
30820 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
30830 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  3], nCell);.  pu
30840 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
30850 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  +5], cellbody);.
30860 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
30870 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73  = (nCell*2 + nUs
30880 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29  able - cellbody)
30890 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
308a0 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
308b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
308c0 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
308d0 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
308e0 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
308f0 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
30900 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
30910 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
30920 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
30930 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
30940 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
30950 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
30960 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
30970 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
30980 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
30990 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
309a0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
309b0 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
309c0 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
309d0 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
309e0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
309f0 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
30a00 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
30a10 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
30a20 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
30a30 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
30a40 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
30a50 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
30a60 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
30a70 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
30a80 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
30a90 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
30aa0 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
30ab0 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
30ac0 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
30ad0 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
30ae0 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
30af0 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
30b00 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
30b10 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
30b20 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
30b30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
30b40 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
30b50 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
30b60 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
30b70 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
30b80 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
30b90 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
30ba0 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  e */...#ifndef S
30bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
30bc0 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
30bd0 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
30be0 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
30bf0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
30c00 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
30c10 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
30c20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
30c30 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
30c40 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
30c50 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
30c60 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
30c70 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
30c80 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
30c90 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
30ca0 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
30cb0 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
30cc0 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20   to balance the 
30cd0 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
30ce0 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
30cf0 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
30d00 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
30d10 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
30d20 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
30d30 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
30d40 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
30d50 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
30d60 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
30d70 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
30d80 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
30d90 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
30da0 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
30db0 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
30dc0 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
30dd0 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
30de0 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
30df0 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
30e00 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
30e10 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
30e20 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
30e30 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
30e40 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
30e50 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
30e60 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
30e70 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
30e80 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
30e90 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
30ea0 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
30eb0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
30ec0 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
30ed0 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
30ee0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
30ef0 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
30f00 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
30f10 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
30f20 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
30f30 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
30f40 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
30f50 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
30f60 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
30f70 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
30f80 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
30f90 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
30fa0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
30fb0 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
30fc0 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
30fd0 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
30fe0 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
30ff0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
31000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
31010 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
31020 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
31030 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
31040 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
31050 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
31060 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
31070 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
31080 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
31090 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
310a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
310b0 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
310c0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
310d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
310e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310f0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
31100 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
31110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31120 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31130 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
31140 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
31150 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
31160 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
31170 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
31180 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
31190 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
311a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
311b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
311c0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
311d0 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
311e0 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77  condition is now
311f0 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
31200 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66   reaching this f
31210 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
31220 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
31230 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
31240 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
31250 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
31260 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70  new page. This p
31270 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
31280 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e  the right-siblin
31290 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65  g of .  ** pPage
312a0 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e  . Make the paren
312b0 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c  t page writable,
312c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
312d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
312e0 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74  ** may be insert
312f0 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73  ed. If both thes
31300 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
31310 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f   successful, pro
31320 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ceed..  */.  rc 
31330 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
31340 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
31350 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
31360 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
31370 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38  TE_OK ){..    u8
31380 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65   *pOut = &pSpace
31390 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  [4];.    u8 *pCe
313a0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76  ll = pPage->apOv
313b0 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73  fl[0];.    u16 s
313c0 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
313d0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
313e0 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70  );.    u8 *pStop
313f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ;..    assert( s
31400 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31410 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
31420 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73  Page) );.    ass
31430 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
31440 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45  a[0]==(PTF_INTKE
31450 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
31460 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20  TF_LEAF) );.    
31470 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50  zeroPage(pNew, P
31480 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
31490 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
314a0 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
314b0 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
314c0 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20  ll, &szCell);.. 
314d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
314e0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
314f0 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
31500 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
31510 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
31520 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
31530 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
31540 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
31550 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
31560 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
31570 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
31580 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
31590 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
315a0 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65  ns fails, the re
315b0 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74  turn code is set
315c0 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  , but the conten
315d0 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
315e0 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65   parent page are
315f0 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74   still manipulat
31600 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62  ed by thh code b
31610 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61  elow..    ** Tha
31620 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73  t is Ok, at this
31630 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e   point the paren
31640 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e  t page is guaran
31650 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  teed to.    ** b
31660 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
31670 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  y. Returning an 
31680 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20  error code will 
31690 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72  cause a.    ** r
316a0 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67  ollback, undoing
316b0 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
316c0 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  e to the parent 
316d0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
316e0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
316f0 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
31700 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
31710 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
31720 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
31730 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
31740 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e  szCell>pNew->min
31750 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
31760 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
31770 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26  r(pNew, pCell, &
31780 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
31790 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.  .    /* Cre
317a0 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65  ate a divider ce
317b0 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  ll to insert int
317c0 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64  o pParent. The d
317d0 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20  ivider cell.    
317e0 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
317f0 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4-byte page num
31800 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75  ber (the page nu
31810 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61  mber of pPage) a
31820 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69  nd.    ** a vari
31830 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20  able length key 
31840 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73  value (which mus
31850 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61  t be the same va
31860 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a  lue as the.    *
31870 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e  * largest key on
31880 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a   pPage)..    **.
31890 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74      ** To find t
318a0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76  he largest key v
318b0 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66  alue on pPage, f
318c0 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69  irst find the ri
318d0 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a  ght-most .    **
318e0 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20   cell on pPage. 
318f0 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  The first two fi
31900 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c  elds of this cel
31910 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a  l are the .    *
31920 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20  * record-length 
31930 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
31940 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f  th integer at mo
31950 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69  st 32-bits in si
31960 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  ze).    ** and t
31970 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20  he key value (a 
31980 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
31990 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76  integer, may hav
319a0 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20  e any value)..  
319b0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f    ** The first o
319c0 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29  f the while(...)
319d0 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69   loops below ski
319e0 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f  ps over the reco
319f0 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  rd-length.    **
31a00 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f   field. The seco
31a10 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  nd while(...) lo
31a20 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65  op copies the ke
31a30 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  y value from the
31a40 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
31a50 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70  pPage into the p
31a60 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
31a70 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d    */.    pCell =
31a80 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
31a90 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
31aa0 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
31ab0 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
31ac0 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26  le( (*(pCell++)&
31ad0 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
31ae0 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f  Stop );.    pSto
31af0 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
31b00 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f     while( ((*(pO
31b10 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b  ut++) = *(pCell+
31b20 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65  +))&0x80) && pCe
31b30 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20  ll<pStop );..   
31b40 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
31b50 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
31b60 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  into pParent. */
31b70 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
31b80 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74  pParent, pParent
31b90 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c  ->nCell, pSpace,
31ba0 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61   (int)(pOut-pSpa
31bb0 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce),.           
31bc0 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67      0, pPage->pg
31bd0 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f  no, &rc);..    /
31be0 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d  * Set the right-
31bf0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
31c00 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e   pParent to poin
31c10 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
31c20 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  e. */.    put4by
31c30 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
31c40 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
31c50 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
31c60 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  w);.  .    /* Re
31c70 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
31c80 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
31c90 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65  age. */.    rele
31ca0 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
31cb0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
31cc0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
31cd0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
31ce0 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a  LANCE */..#if 0.
31cf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
31d00 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
31d10 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67  tribute anything
31d20 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
31d30 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20  n of SQLite..** 
31d40 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  it is sometimes 
31d50 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72  activated tempor
31d60 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75  arily while debu
31d70 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f  gging code respo
31d80 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73  nsible .** for s
31d90 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d  etting pointer-m
31da0 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  ap entries..*/.s
31db0 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
31dc0 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61  CheckPages(MemPa
31dd0 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74  ge **apPage, int
31de0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69   nPage){.  int i
31df0 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
31e00 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  i<nPage; i++){. 
31e10 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75     Pgno n;.    u
31e20 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  8 e;.    MemPage
31e30 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65   *pPage = apPage
31e40 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65  [i];.    BtShare
31e50 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
31e60 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
31e70 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
31e80 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ;..    for(j=0; 
31e90 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  j<pPage->nCell; 
31ea0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  j++){.      Cell
31eb0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
31ec0 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20   u8 *z;.     .  
31ed0 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c      z = findCell
31ee0 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20  (pPage, j);.    
31ef0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
31f00 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69  Ptr(pPage, z, &i
31f10 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
31f20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
31f30 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f  {.        Pgno o
31f40 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
31f50 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  z[info.iOverflow
31f60 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
31f70 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c  apGet(pBt, ovfl,
31f80 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
31f90 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
31fa0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
31fb0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
31fc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31fd0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
31fe0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  f ){.        Pgn
31ff0 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
32000 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  te(z);.        p
32010 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
32020 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
32030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
32040 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
32050 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
32060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
32070 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
32080 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
32090 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
320a0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
320b0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
320c0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70  set+8]);.      p
320d0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
320e0 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
320f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
32100 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
32110 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
32120 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
32130 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
32140 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
32150 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
32160 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
32170 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
32180 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
32190 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
321a0 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
321b0 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
321c0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
321d0 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
321e0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
321f0 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
32200 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
32210 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
32220 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
32230 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
32240 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
32250 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
32260 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
32270 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
32280 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
32290 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
322a0 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
322b0 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
322c0 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
322d0 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
322e0 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
322f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
32300 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
32310 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
32320 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
32330 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
32340 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72  age.apOvfl[] arr
32350 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f  ay), they are no
32360 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e  t copied to pTo.
32370 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72   .**.** Before r
32380 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70  eturning, page p
32390 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69  To is reinitiali
323a0 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49  zed using btreeI
323b0 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
323c0 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
323d0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
323e0 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
323f0 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
32400 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
32410 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
32420 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
32430 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
32440 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
32450 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
32460 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
32470 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
32480 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
32490 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  id copyNodeConte
324a0 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f  nt(MemPage *pFro
324b0 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c  m, MemPage *pTo,
324c0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
324d0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
324e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61  _OK ){.    BtSha
324f0 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20  red * const pBt 
32500 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
32510 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72    u8 * const aFr
32520 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74  om = pFrom->aDat
32530 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  a;.    u8 * cons
32540 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61  t aTo = pTo->aDa
32550 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  ta;.    int cons
32560 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72  t iFromHdr = pFr
32570 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  om->hdrOffset;. 
32580 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f     int const iTo
32590 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
325a0 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
325b0 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
325c0 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a    int iData;.  .
325d0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
325e0 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  From->isInit );.
325f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
32600 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72  m->nFree>=iToHdr
32610 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32620 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
32630 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20  iFromHdr+5]) <= 
32640 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
32650 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f  Size );.  .    /
32660 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65  * Copy the b-tre
32670 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66  e node content f
32680 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74  rom page pFrom t
32690 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20  o page pTo. */. 
326a0 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62     iData = get2b
326b0 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
326c0 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d  Hdr+5]);.    mem
326d0 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c  cpy(&aTo[iData],
326e0 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20   &aFrom[iData], 
326f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
32700 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63  iData);.    memc
32710 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c  py(&aTo[iToHdr],
32720 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72   &aFrom[iFromHdr
32730 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66  ], pFrom->cellOf
32740 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e  fset + 2*pFrom->
32750 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f  nCell);.  .    /
32760 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  * Reinitialize p
32770 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20  age pTo so that 
32780 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32790 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
327a0 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74  cture.    ** mat
327b0 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e  ch the new data.
327c0 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   The initializat
327d0 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61  ion of pTo can a
327e0 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64  ctually fail und
327f0 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79  er.    ** fairly
32800 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73   obscure circums
32810 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f  tances, even tho
32820 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79  ugh it is a copy
32830 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
32840 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72  .    ** page pFr
32850 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  om..    */.    p
32860 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  To->isInit = 0;.
32870 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
32880 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20  itPage(pTo);.   
32890 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
328a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
328b0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
328c0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  urn;.    }.  .  
328d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
328e0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
328f0 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
32900 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
32910 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66  entries.    ** f
32920 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72  or any b-tree or
32930 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
32940 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e  that pTo now con
32950 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
32960 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  rs to..    */.  
32970 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
32980 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  UM ){.      *pRC
32990 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
329a0 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ps(pTo);.    }. 
329b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
329c0 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
329d0 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20  ibutes cells on 
329e0 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74  the iParentIdx't
329f0 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  h child of pPare
32a00 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72  nt.** (hereafter
32a10 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64   "the page") and
32a20 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67   up to 2 sibling
32a30 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61  s so that all pa
32a40 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74  ges have about t
32a50 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e  he.** same amoun
32a60 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e  t of free space.
32a70 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c   Usually a singl
32a80 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74  e sibling on eit
32a90 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a  her side of the.
32aa0 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64  ** page are used
32ab0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
32ac0 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73  g, though both s
32ad0 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f  iblings might co
32ae0 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73  me from one.** s
32af0 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20  ide if the page 
32b00 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  is the first or 
32b10 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
32b20 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65  s parent. If the
32b30 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65   page .** has fe
32b40 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69  wer than 2 sibli
32b50 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  ngs (something w
32b60 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
32b70 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65  ppen if the page
32b80 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61  .** is a root pa
32b90 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66  ge or a child of
32ba0 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68   a root page) th
32bb0 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  en all available
32bc0 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72   siblings.** par
32bd0 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
32be0 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a  balancing..**.**
32bf0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
32c00 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70  iblings of the p
32c10 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  age might be inc
32c20 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61  reased or decrea
32c30 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f  sed by .** one o
32c40 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  r two in an effo
32c50 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
32c60 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
32c70 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
32c80 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
32c90 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
32ca0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
32cb0 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  me of the cells 
32cc0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d  on the page.** m
32cd0 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
32ce0 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d  y be stored in M
32cf0 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20  emPage.aData[]. 
32d00 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
32d10 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
32d20 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73  s overfull. This
32d30 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
32d40 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20   that all cells 
32d50 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20  allocated.** to 
32d60 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
32d70 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e   siblings fit in
32d80 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  to MemPage.aData
32d90 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  [] before return
32da0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ing..**.** In th
32db0 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61  e course of bala
32dc0 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  ncing the page a
32dd0 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c  nd its siblings,
32de0 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a   cells may be.**
32df0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f   inserted into o
32e00 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
32e10 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28  he parent page (
32e20 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20  pParent). Doing 
32e30 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20  so.** may cause 
32e40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
32e50 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  to become overfu
32e60 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
32e70 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70   If this.** happ
32e80 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ens, it is the r
32e90 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
32ea0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69   the caller to i
32eb0 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63  nvoke the correc
32ec0 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72  t.** balancing r
32ed0 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68  outine to fix th
32ee0 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20  is problem (see 
32ef0 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f  the balance() ro
32f00 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  utine). .**.** I
32f10 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
32f20 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
32f30 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65  son, it might le
32f40 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ave the database
32f50 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74  .** in a corrupt
32f60 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20  ed state. So if 
32f70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
32f80 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
32f90 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
32fa0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
32fb0 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   The third argum
32fc0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
32fd0 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65  tion, aOvflSpace
32fe0 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  , is a pointer t
32ff0 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69  o a.** buffer bi
33000 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
33010 20 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68   one page. If wh
33020 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65  ile inserting ce
33030 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
33040 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61  ent.** page (pPa
33050 72 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74  rent) the parent
33060 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76   page becomes ov
33070 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66  erfull, this buf
33080 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  fer is.** used t
33090 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65  o store the pare
330a0 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  nt's overflow ce
330b0 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69  lls. Because thi
330c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72  s function inser
330d0 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20  ts.** a maximum 
330e0 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20  of four divider 
330f0 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70  cells into the p
33100 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20  arent page, and 
33110 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73  the maximum.** s
33120 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74  ize of a cell st
33130 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69  ored within an i
33140 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20  nternal node is 
33150 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e  always less than
33160 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70   1/4.** of the p
33170 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f  age-size, the aO
33180 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65  vflSpace[] buffe
33190 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
331a0 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65  to be large.** e
331b0 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76  nough for all ov
331c0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a  erflow cells..**
331d0 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63  .** If aOvflSpac
331e0 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75  e is set to a nu
331f0 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  ll pointer, this
33200 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
33210 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s .** SQLITE_NOM
33220 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  EM..*/.#if defin
33230 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20  ed(_MSC_VER) && 
33240 5f 4d 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30  _MSC_VER >= 1700
33250 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41   && defined(_M_A
33260 52 4d 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69  RM).#pragma opti
33270 6d 69 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65  mize("", off).#e
33280 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
33290 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
332a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
332b0 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
332c0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
332d0 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
332e0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
332f0 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
33300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33310 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
33320 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
33330 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
33340 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
33350 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
33360 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
33370 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
33380 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
33390 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
333a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
333b0 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
333c0 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  a root-page */. 
333d0 20 69 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20   int bBulk      
333e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333f0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
33400 20 63 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66   call is part of
33410 20 61 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a   a bulk load */.
33420 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33430 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
33440 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
33450 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
33460 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
33470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33480 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
33490 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
334a0 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
334b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
334c0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
334d0 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
334e0 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
334f0 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
33500 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33510 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
33520 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
33530 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
33540 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33550 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
33560 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
33570 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
33580 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
33590 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
335a0 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
335b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
335c0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
335d0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
335e0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
335f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
33600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
33610 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
33620 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
33630 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
33640 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
33650 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
33660 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
33670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33680 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
33690 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
336a0 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
336b0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
336c0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
336d0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
336e0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
336f0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
33700 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
33710 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
33720 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
33730 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
33740 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
33750 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
33760 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
33770 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
33780 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
33790 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
337a0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
337b0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
337c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
337d0 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
337e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
337f0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
33800 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
33810 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
33820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
33830 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
33840 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
33850 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
33860 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
33870 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
33880 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
33890 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
338a0 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
338b0 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
338c0 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
338d0 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
338e0 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
338f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
33900 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
33910 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
33920 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
33930 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
33940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
33950 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
33960 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
33970 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
33980 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
33990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
339a0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
339b0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
339c0 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
339d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
339e0 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
339f0 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
33a00 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
33a10 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
33a20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
33a30 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
33a40 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
33a50 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
33a60 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
33a70 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
33a80 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
33a90 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
33aa0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
33ab0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
33ac0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
33ad0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
33ae0 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
33af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b00 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
33b10 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
33b20 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
33b30 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
33b40 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
33b50 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
33b60 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
33b70 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
33b80 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
33b90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33ba0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
33bb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
33bc0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
33bd0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
33be0 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
33bf0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
33c00 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
33c10 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
33c20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
33c30 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
33c40 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
33c50 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
33c60 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
33c70 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
33c80 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
33c90 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
33ca0 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
33cb0 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
33cc0 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
33cd0 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
33ce0 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
33cf0 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
33d00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
33d10 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
33d20 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
33d30 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
33d40 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
33d50 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
33d60 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
33d70 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
33d80 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
33d90 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33da0 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
33db0 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61  ->aiOvfl[0]==iPa
33dc0 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
33dd0 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
33de0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33df0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
33e00 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
33e10 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
33e20 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
33e30 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
33e40 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
33e50 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
33e60 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
33e70 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
33e80 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
33e90 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
33ea0 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
33eb0 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
33ec0 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
33ed0 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
33ee0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
33ef0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
33f00 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
33f10 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
33f20 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
33f30 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
33f40 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
33f50 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
33f60 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
33f70 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
33f80 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
33f90 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
33fa0 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
33fb0 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
33fc0 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
33fd0 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
33fe0 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
33ff0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
34000 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
34010 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
34020 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69  nt page, since i
34030 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68  f any existed th
34040 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76  ey will.  ** hav
34050 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
34060 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  emoved..  */.  i
34070 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65   = pParent->nOve
34080 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d  rflow + pParent-
34090 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c  >nCell;.  if( i<
340a0 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  2 ){.    nxDiv =
340b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
340c0 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d   assert( bBulk==
340d0 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b  0 || bBulk==1 );
340e0 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74  .    if( iParent
340f0 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  Idx==0 ){       
34100 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
34110 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
34120 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e  }else if( iParen
34130 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20  tIdx==i ){.     
34140 20 6e 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75   nxDiv = i-2+bBu
34150 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  lk;.    }else{. 
34160 20 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75       assert( bBu
34170 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  lk==0 );.      n
34180 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64  xDiv = iParentId
34190 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  x-1;.    }.    i
341a0 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a   = 2-bBulk;.  }.
341b0 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
341c0 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
341d0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
341e0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
341f0 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
34200 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
34210 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
34220 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
34230 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
34240 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
34250 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
34260 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
34270 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
34280 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
34290 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
342a0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
342b0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
342c0 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20  Old[i], 0);.    
342d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
342e0 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
342f0 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
34300 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
34310 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
34320 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
34330 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
34340 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
34350 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
34360 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
34370 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
34380 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
34390 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
343a0 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  0] && pParent->n
343b0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
343c0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
343d0 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  rent->apOvfl[0];
343e0 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
343f0 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
34400 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
34410 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
34420 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
34430 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
34440 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
34450 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34460 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
34470 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
34480 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
34490 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  nOverflow);.    
344a0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
344b0 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
344c0 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
344d0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
344e0 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20  t, apDiv[i]);.. 
344f0 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65       /* Drop the
34500 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70   cell from the p
34510 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69  arent page. apDi
34520 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74  v[i] still point
34530 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
34540 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68  e cell within th
34550 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74  e parent, even t
34560 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65  hough it has bee
34570 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20  n dropped..     
34580 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65   ** This is safe
34590 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e   because droppin
345a0 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76  g a cell only ov
345b0 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72  erwrites the fir
345c0 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
345d0 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e   bytes of it, an
345e0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
345f0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68  does not need th
34600 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
34610 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74   four bytes of t
34620 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e  he divider cell.
34630 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20   So the pointer 
34640 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20  is safe to use. 
34650 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e       ** later on
34660 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  .  .      **.   
34670 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66     ** But not if
34680 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72   we are in secur
34690 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
346a0 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
346b0 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  mode,.      ** t
346c0 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f  he dropCell() ro
346d0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77  utine will overw
346e0 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  rite the entire 
346f0 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73  cell with zeroes
34700 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68  ..      ** In th
34710 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61  is case, tempora
34720 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65  rily copy the ce
34730 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66  ll into the aOvf
34740 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a  lSpace[].      *
34750 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c  * buffer. It wil
34760 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  l be copied out 
34770 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73  again as soon as
34780 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75   the aSpace[] bu
34790 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  ffer.      ** is
347a0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a   allocated.  */.
347b0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62        if( pBt->b
347c0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
347d0 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
347e0 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b         int iOff;
347f0 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  ..        iOff =
34800 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
34810 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53  NT(apDiv[i]) - S
34820 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
34830 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
34840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
34850 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69  Off+szNew[i])>(i
34860 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
34870 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
34880 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
34890 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
348a0 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
348b0 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
348c0 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
348d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
348e0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
348f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34900 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
34910 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c  OvflSpace[iOff],
34920 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
34930 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
34940 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66  apDiv[i] = &aOvf
34950 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
34960 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b  pParent->aData];
34970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34980 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c   }.      dropCel
34990 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
349a0 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
349b0 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c  rflow, szNew[i],
349c0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
349d0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
349e0 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
349f0 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
34a00 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
34a10 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
34a20 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
34a30 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
34a40 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
34a50 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
34a60 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
34a70 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d  tures.  */.  k =
34a80 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
34a90 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
34aa0 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63  emPage));.  szSc
34ab0 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
34ac0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
34ad0 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
34ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
34af0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
34b00 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
34b10 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
34b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
34b30 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Cell */.     + p
34b40 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
34b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
34b70 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
34b80 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  k*nOld;         
34b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
34bb0 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f  age copies (apCo
34bc0 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  py) */.  apCell 
34bd0 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
34be0 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
34bf0 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
34c00 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
34c10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
34c20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
34c30 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
34c40 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
34c50 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
34c60 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28  ];.  aSpace1 = (
34c70 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
34c80 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
34c90 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
34ca0 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
34cb0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f  );..  /*.  ** Lo
34cc0 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
34cd0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
34ce0 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
34cf0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
34d00 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
34d10 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
34d20 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
34d30 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
34d40 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
34d50 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
34d60 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  rom aSpace1[] an
34d70 64 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76  d remove the div
34d80 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
34d90 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
34da0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
34db0 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
34dc0 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
34dd0 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
34de0 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
34df0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
34e00 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
34e10 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
34e20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
34e30 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
34e40 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  1[].  In this wa
34e50 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
34e60 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
34e70 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
34e80 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
34e90 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
34ea0 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
34eb0 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
34ec0 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
34ed0 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
34ee0 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
34ef0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
34f00 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
34f10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
34f20 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
34f30 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
34f40 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
34f50 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
34f60 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
34f70 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
34f80 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
34f90 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
34fa0 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
34fb0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
34fc0 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66  = apOld[0]->leaf
34fd0 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
34fe0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61   apOld[0]->hasDa
34ff0 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
35000 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
35010 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20   int limit;.    
35020 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  .    /* Before d
35030 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
35040 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20  se, take a copy 
35050 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67  of the i'th orig
35060 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20  inal sibling.   
35070 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
35080 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
35090 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
350a0 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
350b0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  er.    ** that t
350c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
350d0 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
350e0 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
350f0 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  be in the.    **
35100 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
35110 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  g overwritten.  
35120 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
35130 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
35140 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53   = (MemPage*)&aS
35150 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
35160 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20  ize + k*i];.    
35170 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f  memcpy(pOld, apO
35180 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
35190 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c  mPage));.    pOl
351a0 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  d->aData = (void
351b0 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20  *)&pOld[1];.    
351c0 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61  memcpy(pOld->aDa
351d0 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
351e0 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
351f0 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20  ze);..    limit 
35200 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
35210 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
35220 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
35230 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
35240 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
35250 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
35260 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
35270 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
35280 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
35290 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
352a0 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
352b0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
352c0 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
352d0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
352e0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
352f0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
35300 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
35310 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20      u8 *aData = 
35320 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20  pOld->aData;.   
35330 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20     u16 maskPage 
35340 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65  = pOld->maskPage
35350 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c  ;.      u16 cell
35360 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63  Offset = pOld->c
35370 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ellOffset;.     
35380 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
35390 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
353a0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
353b0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
353c0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
353d0 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61  ] = findCellv2(a
353e0 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20  Data, maskPage, 
353f0 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a  cellOffset, j);.
35400 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
35410 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
35420 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
35430 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
35440 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
35450 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a   }.    }       .
35460 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
35470 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
35480 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
35490 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
354a0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
354b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
354c0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
354d0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
354e0 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
354f0 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
35500 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
35510 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
35520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
35530 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
35540 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
35550 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28  rt( iSpace1 <= (
35560 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
35570 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e );.      memcp
35580 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
35590 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70  ], sz);.      ap
355a0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
355b0 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
355c0 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  on;.      assert
355d0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
355e0 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
355f0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
35600 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
35610 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  = szCell[nCell] 
35620 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  - leafCorrection
35630 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c  ;.      if( !pOl
35640 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
35650 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
35660 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
35670 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35680 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d  pOld->hdrOffset=
35690 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 );.        /*
356a0 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
356b0 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
356c0 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
356d0 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
356e0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
356f0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
35700 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
35710 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
35720 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
35730 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  8], 4);.      }e
35740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
35750 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
35760 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
35770 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
35780 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
35790 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
357a0 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
357b0 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
357c0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
357d0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
357e0 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
357f0 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
35800 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
35810 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
35820 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
35830 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
35840 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
35850 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
35860 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
35870 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
35880 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
35890 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
358a0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
358b0 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
358c0 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
358d0 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
358e0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
358f0 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
35900 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
35910 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
35920 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
35930 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
35940 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
35950 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
35960 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
35970 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
35980 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
35990 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
359a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
359b0 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
359c0 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
359d0 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
359e0 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
359f0 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
35a00 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
35a10 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
35a20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
35a30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
35a40 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
35a50 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
35a60 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
35a70 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
35a80 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
35a90 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
35aa0 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
35ab0 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
35ac0 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
35ad0 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
35ae0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
35af0 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
35b00 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
35b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
35b20 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
35b30 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
35b40 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
35b50 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
35b60 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
35b70 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
35b80 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
35b90 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
35ba0 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
35bb0 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
35bc0 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
35bd0 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
35be0 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  k++;.      if( k
35bf0 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51  >NB+1 ){ rc = SQ
35c00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35c10 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f  T; goto balance_
35c20 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d  cleanup; }.    }
35c30 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
35c40 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
35c50 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
35c60 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
35c70 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
35c80 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
35c90 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
35ca0 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
35cb0 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
35cc0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
35cd0 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
35ce0 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
35cf0 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
35d00 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
35d10 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
35d20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
35d30 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
35d40 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
35d50 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
35d60 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
35d70 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
35d80 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
35d90 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
35da0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
35db0 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
35dc0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
35dd0 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
35de0 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
35df0 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
35e00 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
35e10 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
35e20 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
35e30 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
35e40 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
35e50 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
35e60 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
35e70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
35e80 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
35e90 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
35ea0 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
35eb0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
35ec0 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
35ed0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
35ee0 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
35ef0 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
35f00 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
35f10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
35f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35f30 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
35f40 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
35f50 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
35f60 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
35f70 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
35f80 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
35f90 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
35fa0 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
35fb0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
35fc0 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
35fd0 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
35fe0 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
35ff0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
36000 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
36010 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
36020 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20  zRight==0 .     
36030 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20    || (!bBulk && 
36040 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
36050 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
36060 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20  ell[r]+2)) .    
36070 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
36080 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
36090 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
360a0 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
360b0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
360c0 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
360d0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
360e0 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
360f0 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
36100 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
36110 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
36120 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
36130 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
36140 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
36150 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
36160 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
36170 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a  or pPage is.  **
36180 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
36190 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
361a0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
361b0 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
361c0 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
361d0 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
361e0 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
361f0 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
36200 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20  *.  ** UPDATE:  
36210 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
36220 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ow is not necess
36230 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74 68  arily true if th
36240 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
36250 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e  file is corrupt.
36260 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e    The corruption
36270 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65   will be detecte
36280 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  d and reported l
36290 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69  ater.  ** in thi
362a0 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74  s procedure so t
362b0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
362c0 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e  to act upon it n
362d0 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ow..  */.#if 0. 
362e0 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
362f0 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74  0]>0 || (pParent
36300 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ->pgno==1 && pPa
36310 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  rent->nCell==0) 
36320 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41  );.#endif..  TRA
36330 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
36340 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a  d: %d %d %d  ",.
36350 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67      apOld[0]->pg
36360 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  no, .    nOld>=2
36370 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e   ? apOld[1]->pgn
36380 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  o : 0,.    nOld>
36390 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70  =3 ? apOld[2]->p
363a0 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20  gno : 0.  ));.. 
363b0 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
363c0 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
363d0 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
363e0 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
363f0 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64    */.  if( apOld
36400 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a  [0]->pgno<=1 ){.
36410 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36420 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
36430 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
36440 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61  leanup;.  }.  pa
36450 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b  geFlags = apOld[
36460 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  0]->aData[0];.  
36470 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
36480 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
36490 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
364a0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
364b0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
364c0 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
364d0 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
364e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
364f0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
36500 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
36510 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
36520 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
36530 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
36540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36550 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
36560 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
36570 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36580 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28   &pNew, &pgno, (
36590 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f  bBulk ? 1 : pgno
365a0 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ), 0);.      if(
365b0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
365c0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
365d0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
365e0 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
365f0 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
36600 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
36610 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
36620 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
36630 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
36640 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
36650 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
36660 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
36670 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
36680 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
36690 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
366a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
366b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
366c0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
366d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
366e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
366f0 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
36700 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
36710 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
36720 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
36730 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
36740 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c     freePage(apOl
36750 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  d[i], &rc);.    
36760 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
36770 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
36780 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
36790 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
367a0 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
367b0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
367c0 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
367d0 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
367e0 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
367f0 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
36800 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
36810 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
36820 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
36830 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
36840 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
36850 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
36860 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
36870 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
36880 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
36890 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
368a0 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
368b0 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
368c0 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
368d0 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
368e0 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
368f0 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
36900 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
36910 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
36920 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
36930 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
36940 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
36950 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
36960 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
36970 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
36980 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
36990 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
369a0 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
369b0 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
369c0 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
369d0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
369e0 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
369f0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
36a00 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
36a10 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
36a20 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
36a30 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
36a40 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d      if( apNew[j]
36a50 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64  ->pgno<(unsigned
36a60 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
36a70 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
36a80 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b     minV = apNew[
36a90 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  j]->pgno;.      
36aa0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
36ab0 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
36ac0 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
36ad0 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
36ae0 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
36af0 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
36b00 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
36b10 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
36b20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a  }.  TRACE(("new:
36b30 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
36b40 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
36b50 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65  %d)\n",.    apNe
36b60 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65  w[0]->pgno, szNe
36b70 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
36b80 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67  2 ? apNew[1]->pg
36b90 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  no : 0, nNew>=2 
36ba0 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
36bb0 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70      nNew>=3 ? ap
36bc0 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[2]->pgno : 0
36bd0 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
36be0 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
36bf0 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d  ew>=4 ? apNew[3]
36c00 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
36c10 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
36c20 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
36c30 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f  ? apNew[4]->pgno
36c40 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
36c50 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
36c60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36c70 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36c80 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
36c90 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79  age) );.  put4by
36ca0 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77  te(pRight, apNew
36cb0 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
36cc0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
36cd0 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
36ce0 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
36cf0 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
36d00 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
36d10 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
36d20 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
36d30 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
36d40 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
36d50 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
36d60 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
36d70 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
36d80 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
36d90 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
36da0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
36db0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
36dc0 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  lls );.    zeroP
36dd0 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
36de0 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
36df0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
36e00 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
36e10 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
36e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
36e30 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
36e40 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
36e50 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
36e60 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
36e70 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
36e80 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
36e90 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
36ea0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
36eb0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
36ec0 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
36ed0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
36ee0 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
36ef0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
36f00 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
36f10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
36f20 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c  ert( i<nNew-1 ||
36f30 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20   j==nCell );.   
36f40 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a   if( j<nCell ){.
36f50 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
36f60 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
36f70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
36f80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
36f90 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
36fa0 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
36fb0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
36fc0 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
36fd0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
36fe0 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76      pTemp = &aOv
36ff0 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61  flSpace[iOvflSpa
37000 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ce];.      if( !
37010 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
37020 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
37030 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
37040 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ell, 4);.      }
37050 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
37060 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
37070 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
37080 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
37090 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
370a0 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
370b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
370c0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
370d0 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
370e0 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
370f0 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
37100 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
37110 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
37120 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
37130 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
37140 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
37150 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
37160 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
37170 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
37180 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
37190 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
371a0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  --;.        btre
371b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
371c0 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
371d0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
371e0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
371f0 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
37200 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
37210 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
37220 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
37230 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
37240 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
37250 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
37260 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
37270 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
37280 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
37290 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
372a0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
372b0 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
372c0 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
372d0 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
372e0 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
372f0 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
37300 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
37310 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
37320 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
37330 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65  see btreeParseCe
37340 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
37350 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
37360 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
37370 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
37380 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
37390 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
373a0 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
373b0 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
373c0 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
373d0 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
373e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
373f0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
37400 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
37410 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
37420 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
37430 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
37440 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
37450 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
37460 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
37470 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
37480 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
37490 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
374a0 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
374b0 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
374c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
374d0 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
374e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
374f0 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
37500 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
37510 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
37520 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
37530 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37540 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
37550 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
37560 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
37570 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20  Bt->maxLocal+23 
37580 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37590 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28   iOvflSpace <= (
375a0 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
375b0 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72  e );.      inser
375c0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
375d0 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
375e0 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67   pTemp, pNew->pg
375f0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
37600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37610 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
37620 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
37630 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
37640 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37650 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
37660 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b  ) );..      j++;
37670 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
37680 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
37690 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
376a0 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
376b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
376c0 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
376d0 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
376e0 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
376f0 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
37700 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
37710 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
37720 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
37730 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
37740 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69  ld, 4);.  }..  i
37750 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61  f( isRoot && pPa
37760 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  rent->nCell==0 &
37770 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  & pParent->hdrOf
37780 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e  fset<=apNew[0]->
37790 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nFree ){.    /* 
377a0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
377b0 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20   the b-tree now 
377c0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
377d0 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c  s. The only sibl
377e0 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ing.    ** page 
377f0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
37800 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
37810 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
37820 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
37830 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74  * child page int
37840 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65  o the parent, de
37850 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65  creasing the ove
37860 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74  rall height of t
37870 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65  he.    ** b-tree
37880 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e   structure by on
37890 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72  e. This is descr
378a0 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c  ibed as the "bal
378b0 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a  ance-shallower".
378c0 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72      ** sub-algor
378d0 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63  ithm in some doc
378e0 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20  umentation..    
378f0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  **.    ** If thi
37900 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
37910 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
37920 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f  e call to copyNo
37930 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20  deContent() .   
37940 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69   ** sets all poi
37950 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
37960 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
37970 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  o database image
37980 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66   pages .    ** f
37990 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69  or which the poi
379a0 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77  nter is stored w
379b0 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ithin the conten
379c0 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a  t being copied..
379d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
379e0 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20  e second assert 
379f0 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
37a00 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61  hat the child pa
37a10 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74  ge is defragment
37a20 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75  ed.    ** (it mu
37a30 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73  st be, as it was
37a40 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63   just reconstruc
37a50 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62  ted using assemb
37a60 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a  lePage()). This.
37a70 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74      ** is import
37a80 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e  ant if the paren
37a90 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  t page happens t
37aa0 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74  o be page 1 of t
37ab0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
37ac0 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20  ** image.  */.  
37ad0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d    assert( nNew==
37ae0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
37af0 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65   apNew[0]->nFree
37b00 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65   == .        (ge
37b10 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d  t2byte(&apNew[0]
37b20 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65  ->aData[5])-apNe
37b30 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  w[0]->cellOffset
37b40 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c  -apNew[0]->nCell
37b50 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  *2) .    );.    
37b60 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
37b70 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e  apNew[0], pParen
37b80 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65  t, &rc);.    fre
37b90 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20  ePage(apNew[0], 
37ba0 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  &rc);.  }else if
37bb0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
37bc0 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65  {.    /* Fix the
37bd0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37be0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
37bf0 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65   cells that were
37c00 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e   shifted around.
37c10 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61   .    ** There a
37c20 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  re several diffe
37c30 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f  rent types of po
37c40 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37c50 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20  s that need to. 
37c60 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
37c70 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74  ith by this rout
37c80 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65  ine. Some of the
37c90 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  se have been set
37ca0 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20   already, but.  
37cb0 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e    ** many have n
37cc0 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot. The followin
37cd0 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a  g is a summary:.
37ce0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
37cf0 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61  1) The entries a
37d00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e  ssociated with n
37d10 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ew sibling pages
37d20 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20   that were not. 
37d30 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69     **      sibli
37d40 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75  ngs when this fu
37d50 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
37d60 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c  d. These have al
37d70 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20  ready.    **    
37d80 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64    been set. We d
37d90 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72  on't need to wor
37da0 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62  ry about old sib
37db0 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a  lings that were.
37dc0 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65      **      move
37dd0 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
37de0 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67  st - the freePag
37df0 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b  e() code has tak
37e00 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20  en care.    **  
37e10 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20      of those..  
37e20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29    **.    **   2)
37e30 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   The pointer-map
37e40 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
37e50 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
37e60 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  st overflow.    
37e70 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20  **      page in 
37e80 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  any overflow cha
37e90 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20  ins used by new 
37ea0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54  divider cells. T
37eb0 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20  hese .    **    
37ec0 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65    have also alre
37ed0 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63  ady been taken c
37ee0 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e  are of by the in
37ef0 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e  sertCell() code.
37f00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
37f10 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   3) If the sibli
37f20 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
37f30 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
37f40 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  e child pages of
37f50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c  .    **      cel
37f60 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ls stored on the
37f70 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d   sibling pages m
37f80 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
37f90 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
37fa0 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65    **   4) If the
37fb0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
37fc0 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20  re not internal 
37fd0 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68  intkey nodes, th
37fe0 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20  en any.    **   
37ff0 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
38000 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20  s used by these 
38010 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74  cells may need t
38020 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20  o be updated.   
38030 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e   **      (intern
38040 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20  al intkey nodes 
38050 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f  never contain po
38060 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c  inters to overfl
38070 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a  ow pages)..    *
38080 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66  *.    **   5) If
38090 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
380a0 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
380b0 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  s, then the poin
380c0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20  ter-map.    **  
380d0 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20      entries for 
380e0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
380f0 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69  pages of each si
38100 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20  bling may need. 
38110 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65     **      to be
38120 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
38130 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20  .    ** Cases 1 
38140 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20  and 2 are dealt 
38150 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74  with above by ot
38160 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65  her code. The ne
38170 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
38180 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73  deals with cases
38190 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65   3 and 4 and the
381a0 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c   one after that,
381b0 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20   case 5. Since. 
381c0 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20     ** setting a 
381d0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
381e0 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c  y is a relativel
381f0 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  y expensive oper
38200 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20  ation, this.    
38210 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74  ** code only set
38220 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  s pointer map en
38230 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20  tries for child 
38240 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
38250 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20  s that have.    
38260 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65  ** actually move
38270 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e  d between pages.
38280 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
38290 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30   *pNew = apNew[0
382a0 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ];.    MemPage *
382b0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d  pOld = apCopy[0]
382c0 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66  ;.    int nOverf
382d0 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
382e0 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
382f0 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e  NextOld = pOld->
38300 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f  nCell + nOverflo
38310 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72  w;.    int iOver
38320 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f  flow = (nOverflo
38330 77 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c  w ? pOld->aiOvfl
38340 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  [0] : -1);.    j
38350 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
38360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38370 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
38380 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
38390 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
383a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
383c0 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
383d0 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
383e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
383f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
38400 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
38410 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
38420 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
38430 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
38440 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
38450 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
38460 7