/ Hex Artifact Content
Login

Artifact 746c4dafae8565b3be6fb9ce3bb1fa9f1e67cc59:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4d10: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4d20: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4d30: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4d40: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4d50: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4d60: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
4d70: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
4d80: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
4d90: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4da0: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
4db0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
4dc0: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
4dd0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
4de0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
4df0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
4e00: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
4e10: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
4e20: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
4e30: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
4e40: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
4e50: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
4e60: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
4e70: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
4e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
4e90: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
4ea0: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
4eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
4ec0: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
4ed0: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
4ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4ef0: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
4f00: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
4f10: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
4f20: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
4f30: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
4f40: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
4f50: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
4f60: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
4f70: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
4f80: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
4f90: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
4fa0: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
4fb0: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
4fc0: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
4fd0: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
4fe0: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
4ff0: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
5000: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
5010: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
5020: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
5030: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
5040: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50  if( 0==pCur->apP
5050: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
5060: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
5070: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
5080: 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  ( (int)pCur->nKe
5090: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
50a0: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
50b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
50c0: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
50d0: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
50e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
50f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5100: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5110: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
5120: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5130: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
5140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5150: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
5160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5170: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5180: 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
5190: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
51a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
51b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
51c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
51d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
51e0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
51f0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
5200: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
5210: 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  i]);.      pCur-
5220: 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
5230: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
5240: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  iPage = -1;.    
5250: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5260: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5270: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5280: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5290: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
52a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
52b0: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
52c0: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
52d0: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
52e0: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
52f0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
5300: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5310: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
5320: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
5330: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5340: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
5350: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
5360: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
5370: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5380: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
5390: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
53a0: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
53b0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
53c0: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
53d0: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
53e0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
53f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5400: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
5420: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
5430: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
5440: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
5450: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5460: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
5470: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
5480: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
5490: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
54a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
54b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
54c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
54d0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
54e0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
54f0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5500: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
5510: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
5520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5530: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5540: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5550: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5560: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
5570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
5580: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5590: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
55a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
55b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
55c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
55d0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
55e0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
55f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5600: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
5610: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
5620: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
5630: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
5640: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
5650: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
5660: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
5670: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
5680: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5690: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
56a0: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
56b0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
56c0: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
56d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
56e0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
56f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
5700: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
5710: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
5720: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
5730: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
5740: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
5750: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
5760: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5770: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5780: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5790: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
57a0: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
57b0: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
57c0: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
57d0: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
57e0: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
57f0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
5800: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
5810: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
5820: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
5830: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5850: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
5860: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5870: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5880: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5890: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
58a0: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
58b0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
58c0: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
58d0: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
58e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
58f0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
5900: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5910: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5920: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5930: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5940: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
5950: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
5960: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5970: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
5980: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
5990: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
59a0: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
59b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
59c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
59d0: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
59e0: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
59f0: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
5a00: 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xKey);.  }else{.
5a10: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
5a20: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5a30: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
5a40: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
5a50: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
5a60: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
5a70: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
5a80: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
5a90: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
5aa0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
5ab0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5ac0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5ad0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5ae0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5af0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5b00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5b10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5b20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5b30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
5b40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
5b50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
5b60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
5b70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
5b80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
5b90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5ba0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5bb0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5bc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5bd0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5be0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5bf0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5c00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5c10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5c20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5c30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5c40: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5c50: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5c60: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5c70: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5c80: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
5c90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5ca0: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5cb0: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5cc0: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5cd0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5ce0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5cf0: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5d00: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5d10: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5d20: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5d30: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5d40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5d60: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5d70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5d80: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5d90: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5da0: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5db0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5dc0: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5dd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5de0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5df0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5e00: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5e10: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5e20: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5e30: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5e40: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5e50: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5e60: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5e70: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5e80: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5e90: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5ea0: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5eb0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5ec0: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5ed0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5ee0: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5ef0: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5f00: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5f10: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5f20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5f30: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5f40: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5f50: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5f60: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5f70: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5f80: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5f90: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5fa0: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5fb0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5fc0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5fd0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5fe0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5ff0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
6000: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6010: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
6020: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
6030: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
6040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6050: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6060: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6070: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
6080: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
6090: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
60a0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
60b0: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
60c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
60d0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
60e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
60f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
6100: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
6110: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
6120: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
6130: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
6140: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
6150: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
6160: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
6170: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
6180: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
6190: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
61a0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
61b0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
61c0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
61d0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
61e0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
61f0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
6200: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
6210: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
6220: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
6230: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
6240: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
6250: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
6260: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
6270: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
6280: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
6290: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
62a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
62b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
62c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
62d0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
62e0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
62f0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6300: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6310: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6320: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6330: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
6340: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
6350: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
6360: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
6370: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
6380: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
6390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
63a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
63b0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
63c0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
63d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
63e0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
63f0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6400: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6410: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6420: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6430: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
6440: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6450: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
6460: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
6470: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
6480: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
6490: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
64a0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
64b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
64c0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
64d0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
64e0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
64f0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6500: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6510: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6520: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6530: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
6540: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
6550: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
6560: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6570: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
6580: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
6590: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
65a0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
65b0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
65c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
65d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
65e0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
65f0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6600: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6610: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6630: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
6640: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
6650: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
6660: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
6670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6680: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6690: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
66a0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
66b0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
66c0: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
66d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
66e0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
66f0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6700: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6710: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6720: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6730: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
6740: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
6750: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6760: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
6770: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
6780: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6790: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
67a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
67b0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
67c0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
67d0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
67e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
67f0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6800: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6810: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6820: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6830: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
6840: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
6850: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6860: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6870: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6880: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6890: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
68a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
68b0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
68c0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
68d0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
68e0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
68f0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6900: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6910: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6920: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
6930: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
6940: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
6950: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
6960: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
6970: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
6980: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6990: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
69a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
69b0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
69c0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
69d0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
69e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
69f0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6a00: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6a10: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6a20: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
6a40: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6a50: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
6a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6a70: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
6a80: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6a90: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6aa0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6ab0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6ac0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6ad0: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6ae0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6af0: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6b00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6b10: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6b20: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
6b30: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
6b40: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
6b50: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b60: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
6b70: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
6b80: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6b90: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6ba0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6bb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6bc0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6bd0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6be0: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6bf0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6c00: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6c10: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6c20: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6c30: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
6c40: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
6c50: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
6c60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6c70: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6c80: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6c90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6ca0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6cc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6cd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6ce0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6cf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6d00: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6d10: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6d20: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6d30: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6d40: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6d50: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6d60: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6d70: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6d80: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6d90: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6da0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6db0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6dc0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6dd0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6de0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6df0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6e00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6e10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6e20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6e30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6e40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6e50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6e60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6e70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6e80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6ea0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ec0: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6ed0: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6ee0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6ef0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f00: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6f10: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f20: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6f30: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6f40: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6f50: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6f60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6f70: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6f80: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6f90: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6fa0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6fb0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6fc0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6fd0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6fe0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6ff0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
7000: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
7010: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
7020: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
7030: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
7040: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
7050: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
7060: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
7070: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
7080: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
7090: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43  et2byte(&(P)->aC
70a0: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
70b0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
70c0: 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b  lv2(D,M,O,I) (D+
70d0: 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f  (M&get2byte(D+(O
70e0: 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a  +2*(I))))).../*.
70f0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
7100: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
7110: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
7120: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
7130: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
7140: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7150: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
7160: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
7170: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
7180: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
7190: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
71a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
71b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
71c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
71d0: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
71e0: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
71f0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
7200: 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69     k = pPage->ai
7210: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Ovfl[i];.    if(
7220: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
7230: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
7240: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7250: 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
7260: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
7270: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
7280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
7290: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
72a0: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
72b0: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
72c0: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
72d0: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
72e0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
72f0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
7300: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
7310: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65   function.  btre
7320: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
7330: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
7340: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
7350: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62  d argument and b
7360: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7370: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
7380: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
7390: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
73a0: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
73b0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
73c0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
73d0: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
73e0: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
73f0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
7400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7410: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
7420: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
7430: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
7440: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7450: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7460: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
7470: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7480: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7490: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
74a0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
74b0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
74c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
74d0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
74e0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
74f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7500: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7510: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
7520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7530: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
7540: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
7550: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
7560: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
7570: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7580: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
7590: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
75a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
75b0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
75c0: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
75d0: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
75e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
75f0: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
7600: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
7610: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
7620: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
7630: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
7640: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
7650: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
7660: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7670: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7680: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7690: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
76a0: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
76b0: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
76c0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
76d0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
76e0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
76f0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
7700: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7710: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7720: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
7730: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
7740: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7750: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7760: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
7770: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
7780: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
7790: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
77a0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
77b0: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73  eader = n;.  tes
77c0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
77d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
77e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
77f0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
7800: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
7810: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
7820: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
7830: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
7840: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
7850: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
7860: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
7870: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
7880: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
7890: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
78a0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
78b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
78c0: 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d   (pInfo->nSize =
78d0: 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61   (u16)(n+nPayloa
78e0: 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  d))<4 ) pInfo->n
78f0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
7900: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7910: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
7920: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7930: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
7940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
7950: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
7960: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
7970: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
7980: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
7990: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
79a0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
79b0: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
79c0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
79d0: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
79e0: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
79f0: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
7a00: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
7a10: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
7a20: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
7a30: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
7a40: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
7a50: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
7a60: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
7a70: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
7a80: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
7a90: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
7aa0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
7ab0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
7ac0: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
7ad0: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
7ae0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
7af0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
7b00: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
7b10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
7b20: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
7b30: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
7b40: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b50: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7b60: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
7b70: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
7b80: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b90: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7ba0: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
7bb0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
7bc0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
7bd0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
7be0: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
7bf0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
7c00: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
7c10: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
7c20: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
7c30: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
7c40: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
7c50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7c60: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7c70: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7c80: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
7c90: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72     testcase( sur
7ca0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
7cb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70   );.    if( surp
7cc0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
7cd0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
7ce0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
7cf0: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
7d00: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
7d20: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7d30: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d40: 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d  w = (u16)(pInfo-
7d50: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20  >nLocal + n);.  
7d60: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7d70: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d80: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
7d90: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
7da0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
7db0: 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72  fo) \.  btreePar
7dc0: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
7dd0: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
7de0: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
7df0: 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76  pInfo)).static v
7e00: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7e10: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
7e20: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7e30: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7e40: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
7e50: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
7e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
7e70: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
7e80: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
7e90: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
7eb0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
7ec0: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
7ed0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7ee0: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
7ef0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
7f00: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
7f10: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
7f20: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
7f30: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
7f40: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
7f50: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
7f60: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
7f70: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7f80: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
7f90: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
7fa0: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
7fb0: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
7fc0: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
7fd0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
7ff0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
8000: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8010: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
8020: 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61  ter = &pCell[pPa
8030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8040: 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  ];.  u32 nSize;.
8050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8060: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
8070: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
8080: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
8090: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
80a0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
80b0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
80c0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
80d0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
80e0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
80f0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
8100: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
8110: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
8120: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
8130: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
8140: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
8150: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
8160: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
8170: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
8180: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8190: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
81a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
81b0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
81c0: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
81d0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
81e0: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
81f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
8200: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
8210: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
8220: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
8230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
8240: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
8250: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
8260: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
8270: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
8280: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
8290: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
82a0: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
82b0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
82c0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
82d0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
82e0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
82f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8300: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
8310: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
8320: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
8330: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
8340: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
8350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8360: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8370: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8380: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  ;.  }..  testcas
8390: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
83a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
83b0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
83c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
83d0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
83e0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
83f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   ){.    int minL
8400: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8410: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
8420: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
8430: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
8440: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
8450: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
8460: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8470: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8480: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
8490: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
84a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
84b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
84c0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
84d0: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
84e0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
84f0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
8500: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
8510: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
8520: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
8530: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
8540: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
8550: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
8560: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
8570: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
8580: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
8590: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
85a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
85b0: 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65  )nSize;.}..#ifde
85c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
85d0: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
85e0: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
85f0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
8600: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8610: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
8620: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
8630: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
8640: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8650: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
8660: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
8670: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8680: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
8690: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
86a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
86b0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
86c0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
86d0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
86e0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
86f0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
8700: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
8710: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
8720: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
8730: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
8740: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
8750: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8760: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
8770: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
8780: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
8790: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
87a0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
87b0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
87c0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65  ell!=0 );.  btre
87d0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
87e0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
87f0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
8800: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
8810: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
8820: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
8830: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
8840: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
8850: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
8860: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
8870: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
8880: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
8890: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
88a0: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
88b0: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
88c0: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
88d0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
88e0: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
88f0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
8900: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
8910: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
8920: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
8930: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
8940: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8950: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8960: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8970: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
8980: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
8990: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
89a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
89b0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
89c0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
89d0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
89e0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8a10: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8a40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8a50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8a70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
8a80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
8a90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
8aa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8ab0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
8ac0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
8ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8ae0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
8af0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
8b00: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
8b10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8b20: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8b30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
8b40: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8b70: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8b80: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
8b90: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
8ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8bb0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
8bc0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
8bd0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8be0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8bf0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8c00: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8c10: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8c20: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8c30: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8c40: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8c50: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8c60: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
8c80: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
8c90: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
8ca0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
8cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8cc0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8cd0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8ce0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8cf0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8d10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8d20: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8d30: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8d40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8d50: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8d60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8d70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8d80: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8d90: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
8da0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
8db0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
8dc0: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
8dd0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8de0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8df0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8e00: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8e10: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8e20: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8e30: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8e40: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8e50: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8e60: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8e70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8e80: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
8e90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8ea0: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
8eb0: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
8ec0: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
8ed0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8ee0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8ef0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8f00: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8f10: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8f20: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8f30: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8f40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8f50: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8f60: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8f70: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8f80: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
8f90: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
8fa0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
8fb0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
8fc0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8fd0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8fe0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8ff0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
9000: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9010: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9020: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
9030: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
9040: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9050: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
9060: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
9070: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
9080: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9090: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
90a0: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
90b0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
90c0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
90d0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
90e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
90f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9100: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9110: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9120: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
9130: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
9140: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9150: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
9160: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9170: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9180: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9190: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
91a0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
91b0: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
91c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91e0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
91f0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
9200: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
9210: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9230: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9240: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9250: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9260: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9270: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9280: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9290: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
92a0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
92b0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
92c0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
92d0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
92e0: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
92f0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
9300: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
9310: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
9320: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
9330: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
9340: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
9350: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
9360: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
9370: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
9380: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9390: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
93a0: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
93b0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
93c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93d0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93e0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93f0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
9400: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
9410: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
9420: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9430: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9450: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
9460: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
9470: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
9480: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9490: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
94a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
94b0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
94c0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
94d0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
94e0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
94f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
9500: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
9510: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
9520: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
9530: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
9540: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
9550: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
9560: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
9570: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
9580: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9590: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
95a0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
95b0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
95c0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
95d0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
95e0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
95f0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
9600: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
9610: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
9620: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
9630: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
9640: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
9650: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
9660: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
9670: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
9680: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
9690: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
96a0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
96b0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
96c0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
96d0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
96e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
96f0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
9700: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9710: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
9720: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
9730: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
9740: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
9750: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
9760: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
9770: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
9780: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9790: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
97a0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
97b0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
97c0: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
97f0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
9800: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
9810: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9840: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9850: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9860: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9870: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
9880: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
9890: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
98a0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
98b0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
98c0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
98d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
98e0: 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
98f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
9900: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
9910: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9920: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9930: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9940: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9950: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9970: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9980: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9990: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
99a0: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
99b0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
99c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
99d0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
99e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
99f0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9a00: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
9a10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9a20: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
9a30: 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a  Byte < usableSiz
9a40: 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20  e-8 );..  nFrag 
9a50: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
9a60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a70: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
9a80: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
9a90: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
9aa0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9ab0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
9ac0: 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65  Cell;.  top = ge
9ad0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9ae0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
9af0: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
9b00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9b10: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
9b20: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
9b30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9b40: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
9b50: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9b60: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9b70: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9b80: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9b90: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9ba0: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9bb0: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9bc0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9bd0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9be0: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9bf0: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9c00: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c10: 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c  }else if( gap+2<
9c20: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =top ){.    /* S
9c30: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
9c40: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9c50: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9c60: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9c70: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
9c80: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
9c90: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
9ca0: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
9cb0: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
9cc0: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
9cd0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
9ce0: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
9cf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
9d00: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
9d10: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
9d20: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
9d30: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
9d40: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
9d50: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
9d60: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9d70: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
9d80: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
9d90: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61  leSize-4 || pc<a
9da0: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  ddr+4 ){.       
9db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9dc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9dd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20     }.      size 
9de0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9df0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
9e00: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
9e10: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
9e20: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
9e30: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9e40: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
9e50: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
9e60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9e70: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x<4 ){.         
9e80: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
9e90: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
9ea0: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
9eb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
9ec0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
9ed0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
9ee0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
9ef0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9f00: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61  &data[addr], &da
9f10: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
9f20: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
9f30: 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b  ] = (u8)(nFrag +
9f40: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   x);.        }el
9f50: 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e  se if( size+pc >
9f60: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
9f70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9f80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f90: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
9fa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
9fb0: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
9fc0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
9fd0: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
9fe0: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
9ff0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
a000: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
a010: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
a020: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
a030: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a040: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
a050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a060: 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b   *pIdx = pc + x;
a070: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
a090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a0a0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
a0b0: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65   sure there is e
a0c0: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74  nough space in t
a0d0: 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66  he gap to satisf
a0e0: 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63  y.  ** the alloc
a0f0: 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20  ation.  If not, 
a100: 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f  defragment..  */
a110: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a120: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
a130: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
a140: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63  te>top ){.    rc
a150: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
a160: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
a170: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a180: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a190: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
a1a0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
a1b0: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
a1c0: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
a1d0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
a1e0: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
a1f0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a200: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a210: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
a220: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a230: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
a240: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
a250: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
a260: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
a270: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
a280: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
a290: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
a2a0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
a2b0: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
a2c0: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
a2d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a2e0: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
a2f0: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
a300: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
a310: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
a320: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
a330: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
a340: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
a360: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
a370: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a380: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
a390: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
a3a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a3b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
a3c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
a3d0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
a3e0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
a3f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a400: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
a410: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
a420: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
a430: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a440: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
a450: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
a460: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
a470: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
a480: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
a490: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
a4a0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
a4b0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
a4c0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
a4d0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
a4e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a4f0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a500: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a510: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74  egin, hdr;.  int
a520: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a540: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
a550: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
a560: 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  set */.  unsigne
a570: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
a580: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
a590: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a5a0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a5b0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a5c0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a5d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a5e0: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
a5f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
a600: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
a610: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
a620: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
a630: 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  ) <= (int)pPage-
a640: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a660: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a670: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a680: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a690: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
a6a0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
a6b0: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66  ze is 4 */..  if
a6c0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
a6d0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
a6e0: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
a6f0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
a700: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
a710: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
a720: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
a730: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
a740: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
a750: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
a760: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a770: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
a780: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
a790: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
a7a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
a7b0: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
a7c0: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
a7d0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
a7e0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
a7f0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
a800: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
a810: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
a820: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
a830: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
a840: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
a850: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
a860: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
a870: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
a880: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
a890: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
a8a0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a8b0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
a8c0: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
a8d0: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
a8e0: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
a8f0: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
a900: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
a910: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a920: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
a930: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
a940: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
a950: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
a960: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
a970: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
a980: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
a990: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
a9a0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
a9b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a9c0: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
a9d0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
a9e0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
a9f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
aa00: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
aa10: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
aa20: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
aa30: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
aa40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
aa50: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
aa60: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
aa70: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
aa80: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
aa90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
aaa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
aab0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
aac0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
aad0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
aae0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
aaf0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ab00: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
ab10: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ab20: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ab30: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
ab40: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
ab50: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
ab60: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
ab70: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
ab80: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
ab90: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
aba0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
abb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
abc0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
abd0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
abe0: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
abf0: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
ac00: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
ac10: 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  n <= (int)pPage-
ac20: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ac30: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
ac40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ac50: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
ac60: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ac70: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ac80: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
ac90: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
aca0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
acb0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
acc0: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
acd0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
ace0: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
acf0: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
ad00: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
ad10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ad20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ad30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
ad50: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
ad60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ad70: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
ad80: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ad90: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
ada0: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
adb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
adc0: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
add0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
ade0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
adf0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
ae00: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
ae10: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
ae20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
ae30: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
ae40: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
ae50: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
ae60: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
ae70: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
ae80: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
ae90: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
aea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
aeb0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
aec0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
aed0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
aee0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
aef0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
af00: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
af10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
af20: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
af30: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
af40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
af50: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
af60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
af70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
af80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
af90: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
afa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
afb0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
afc0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
afd0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
afe0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aff0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
b000: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
b010: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
b020: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
b030: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
b040: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
b050: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
b060: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
b070: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
b080: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
b090: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
b0a0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
b0b0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
b0c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
b0d0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
b0e0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
b0f0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b100: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
b110: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
b130: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
b140: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
b150: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
b160: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
b170: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b180: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
b190: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
b1a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b1b0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
b1c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b1d0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
b1e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b1f0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b200: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b210: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b220: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
b230: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
b240: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
b250: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
b260: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
b270: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b280: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
b290: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
b2a0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
b2b0: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
b2c0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b2d0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
b2e0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
b2f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b300: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
b310: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b320: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b330: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b340: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b350: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
b360: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
b370: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
b380: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b390: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
b3a0: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
b3b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b3c0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b3d0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b3e0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b3f0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
b400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b410: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b420: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
b430: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
b440: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b450: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
b460: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b470: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b480: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b490: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b4a0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
b4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
b4c0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
b4d0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
b4e0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
b4f0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
b500: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
b510: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
b520: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
b530: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
b540: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
b550: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
b560: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
b570: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
b580: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
b590: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
b5a0: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
b5b0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
b5c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
b5d0: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
b5e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
b5f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b600: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
b610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b620: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b630: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b640: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b650: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
b660: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
b670: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b680: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b690: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b6a0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
b6b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b6c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
b6d0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
b6e0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
b6f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
b700: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
b710: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
b720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b730: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
b740: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
b750: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
b760: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
b770: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b780: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
b790: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
b7a0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
b7b0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
b7c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
b7d0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
b7e0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
b7f0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
b800: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
b810: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
b820: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
b830: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
b840: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
b850: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
b860: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
b870: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
b880: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
b890: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
b8a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
b8b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
b8c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
b8d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
b8e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
b8f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
b900: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
b910: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
b920: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b930: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
b940: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
b950: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b960: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
b970: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
b980: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
b990: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
b9a0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
b9b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
b9c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b9d0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
b9e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b9f0: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
ba00: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
ba10: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
ba20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ba30: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
ba40: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
ba50: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
ba60: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
ba70: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
ba80: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
ba90: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
baa0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
bab0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
bac0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
bad0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
bae0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
baf0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
bb00: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
bb10: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
bb20: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
bb30: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
bb40: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
bb50: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
bb60: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
bb70: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
bb80: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
bb90: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
bba0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
bbb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
bbc0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
bbd0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
bbe0: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
bbf0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
bc00: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
bc10: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
bc20: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
bc30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bc50: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
bc60: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
bc70: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
bc80: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
bc90: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
bca0: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
bcb0: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
bcc0: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
bcd0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
bce0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
bcf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
bd00: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
bd10: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
bd20: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
bd30: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
bd40: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
bd50: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
bd60: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
bd80: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
bd90: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
bda0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
bdb0: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
bdc0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
bdd0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
bde0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
bdf0: 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65   - 4;.#if define
be00: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
be10: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
be20: 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ECK).    {.     
be30: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
be40: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
be50: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
be60: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
be70: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
be80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
be90: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
bea0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
beb0: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
bec0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bed0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
bee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
bef0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bf00: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
bf10: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bf20: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
bf30: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
bf40: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
bf50: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
bf60: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf70: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf80: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
bf90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bfa0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
bfc0: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
bfd0: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
bfe0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bff0: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
c000: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
c010: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
c020: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c040: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c060: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
c070: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
c080: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23  ast++;.    }  .#
c090: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
c0a0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c0b0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c0c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
c0d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c0e0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
c0f0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
c100: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
c110: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
c120: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
c130: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
c140: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c150: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c160: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
c170: 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  f free block is 
c180: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
c190: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c1a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c1b0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c1c0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
c1d0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
c1e0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
c1f0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
c200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
c210: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
c220: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
c230: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c240: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
c250: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c260: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c270: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
c280: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
c290: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
c2a0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
c2b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
c2c0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c2e0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c2f0: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
c300: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
c310: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
c320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c330: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
c340: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
c350: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
c360: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
c370: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
c380: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
c390: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
c3a0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
c3b0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
c3c0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c3d0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
c3e0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
c3f0: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
c400: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
c410: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
c420: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
c430: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
c440: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
c450: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
c460: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c470: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
c480: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
c490: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
c4a0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
c4b0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
c4c0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
c4d0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c500: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c510: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
c520: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
c530: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
c540: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
c550: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
c560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c570: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
c580: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
c590: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
c5a0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
c5b0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
c5c0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
c5d0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
c5e0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c5f0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
c600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c610: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c620: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
c630: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
c640: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
c650: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
c660: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
c670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c680: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
c690: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c6a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
c6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c6c0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
c6d0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
c6e0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
c6f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c700: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c710: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c720: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
c730: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c740: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c750: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c760: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c770: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c780: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
c790: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
c7a0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
c7b0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
c7c0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
c7d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c7e0: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
c7f0: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
c800: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
c810: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
c820: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
c830: 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65  0 ?1:0);.  memse
c840: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
c850: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
c860: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
c870: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c880: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
c890: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
c8a0: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
c8b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c8c0: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
c8d0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
c8e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
c8f0: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
c900: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c910: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
c920: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
c930: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
c940: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
c950: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
c960: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
c970: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
c980: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
c990: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
c9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
c9b0: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
c9c0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
c9d0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
c9e0: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
c9f0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
ca00: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
ca10: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
ca20: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
ca30: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
ca40: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
ca50: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
ca60: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
ca70: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
ca80: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
ca90: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
caa0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
cab0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
cac0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
cad0: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
cae0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
caf0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
cb00: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
cb10: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
cb20: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
cb30: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
cb40: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
cb50: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
cb60: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
cb70: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
cb80: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
cb90: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
cba0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
cbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
cbc0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
cbd0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
cbe0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cbf0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc00: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc10: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
cc20: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
cc30: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
cc40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
cc50: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
cc60: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
cc70: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
cc80: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
cc90: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
cca0: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
ccb0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
ccc0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
ccd0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
cce0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
ccf0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
cd00: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
cd10: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
cd20: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
cd30: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
cd40: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
cd50: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
cd60: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
cd70: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
cd80: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
cd90: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
cda0: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
cdb0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
cdc0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
cdd0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
cde0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
cdf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
ce00: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
ce10: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
ce20: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
ce30: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
ce40: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
ce50: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
ce60: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
ce70: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
ce80: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
ce90: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
cea0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
ceb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cec0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
ced0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
cee0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
cef0: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
cf00: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
cf10: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
cf20: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
cf30: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cf40: 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
cf50: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
cf60: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
cf70: 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
cf80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cf90: 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67  * Retrieve a pag
cfa0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
cfb0: 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72   cache. If the r
cfc0: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
cfd0: 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20   not.** already 
cfe0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
cff0: 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  he return NULL. 
d000: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
d010: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
d020: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
d030: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
d040: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  ed..*/.static Me
d050: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
d060: 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20  Lookup(BtShared 
d070: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
d080: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
d090: 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
d0a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d0b0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d0c0: 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
d0d0: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
d0e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
d0f0: 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
d100: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
d110: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
d120: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
d130: 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  o, pBt);.  }.  r
d140: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d150: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
d160: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d170: 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
d180: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
d190: 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
d1a0: 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
d1b0: 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
d1c0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72  .static Pgno btr
d1d0: 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  eePagecount(BtSh
d1e0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65  ared *pBt){.  re
d1f0: 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b  turn pBt->nPage;
d200: 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  .}.u32 sqlite3Bt
d210: 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65  reeLastPage(Btre
d220: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
d230: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
d240: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
d250: 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74  assert( ((p->pBt
d260: 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30  ->nPage)&0x80000
d270: 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  00)==0 );.  retu
d280: 72 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61 67  rn (int)btreePag
d290: 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
d2a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
d2b0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
d2c0: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
d2d0: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
d2e0: 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a  ine is just a.**
d2f0: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
d300: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
d310: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74  rate calls to bt
d320: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
d330: 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61   .** btreeInitPa
d340: 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ge()..**.** If a
d350: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
d360: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a  then the value *
d370: 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
d380: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
d390: 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
d3a0: 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
d3b0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
d3c0: 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
d3d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
d3e0: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
d3f0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
d400: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d410: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
d420: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
d430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d440: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
d450: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
d460: 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f  e **ppPage     /
d470: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
d480: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
d490: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
d4a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d4b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d4c0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 66 28  mutex) );..  if(
d4d0: 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
d4e0: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
d4f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
d500: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
d510: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
d520: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
d530: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
d540: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d550: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d560: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
d570: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
d580: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d590: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d5a0: 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
d5b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
d5c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63    }.  }..  testc
d5d0: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
d5e0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
d5f0: 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
d600: 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
d610: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d620: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
d630: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
d640: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
d650: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
d660: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
d670: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
d680: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
d690: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
d6a0: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
d6b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d6c0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
d6d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d6e0: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
d6f0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d700: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
d710: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
d720: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20  id*)pPage );.   
d730: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d740: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
d750: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
d760: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
d770: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d780: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
d790: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
d7a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
d7b0: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
d7c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
d7d0: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
d7e0: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
d7f0: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
d800: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
d810: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
d820: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
d830: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
d840: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
d850: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
d860: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
d870: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
d880: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
d890: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d8a0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d8b0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
d8c0: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
d8d0: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
d8e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
d8f0: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
d900: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
d910: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
d920: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
d930: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
d940: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
d950: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
d960: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
d970: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d980: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
d990: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
d9a0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
d9b0: 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
d9c0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
d9d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d9e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
d9f0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
da00: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
da10: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
da20: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
da30: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
da40: 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
da50: 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
da60: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
da70: 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
da80: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
da90: 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
daa0: 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
dab0: 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
dac0: 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
dad0: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
dae0: 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
daf0: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
db00: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
db10: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
db20: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
db30: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
db40: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
db50: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
db60: 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
db70: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
db80: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
db90: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
dba0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
dbb0: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
dbc0: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
dbd0: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
dbe0: 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
dbf0: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
dc00: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
dc10: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
dc20: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
dc30: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
dc40: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
dc50: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
dc60: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
dc70: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
dc80: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
dc90: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
dca0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dcb0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
dcc0: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
dcd0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
dce0: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
dcf0: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
dd00: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
dd10: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
dd20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
dd30: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
dd40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
dd50: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
dd60: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
dd70: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
dd80: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
dd90: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
dda0: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
ddb0: 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
ddc0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
ddd0: 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
dde0: 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
ddf0: 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
de00: 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
de10: 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
de20: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
de30: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
de40: 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
de50: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
de60: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
de70: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
de80: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
de90: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
dea0: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
deb0: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
dec0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
ded0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
dee0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
def0: 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
df00: 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
df10: 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
df20: 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
df30: 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
df40: 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
df50: 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
df60: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
df70: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
df80: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
df90: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
dfa0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
dfb0: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
dfc0: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
dfd0: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
dfe0: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
dff0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
e000: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
e010: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
e020: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
e030: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
e040: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e050: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
e060: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
e070: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
e080: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
e090: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
e0a0: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
e0b0: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
e0c0: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
e0d0: 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
e0e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e0f0: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
e100: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
e110: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
e120: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
e130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
e140: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
e150: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
e160: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
e170: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
e180: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
e190: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
e1a0: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
e1b0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e1d0: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
e1e0: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
e1f0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
e200: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
e210: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
e220: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
e230: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
e240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
e250: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
e260: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
e270: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
e2a0: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
e2b0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
e2c0: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
e2d0: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
e2e0: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
e2f0: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
e300: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e310: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
e320: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
e330: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
e340: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e360: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
e370: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
e380: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
e390: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
e3a0: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
e3b0: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
e3c0: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
e3d0: 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
e3e0: 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
e3f0: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
e400: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
e410: 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
e420: 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
e430: 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
e440: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
e450: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
e460: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
e470: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
e480: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
e490: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
e4a0: 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
e4b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
e4c0: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
e4d0: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
e4e0: 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
e4f0: 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
e500: 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
e510: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
e520: 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
e550: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
e560: 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
e590: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
e5a0: 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
e5b0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
e5c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
e5d0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e5e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e5f0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
e600: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
e610: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
e620: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
e630: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
e640: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
e650: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e660: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
e670: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
e680: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e690: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
e6a0: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
e6b0: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
e6c0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
e6d0: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
e6e0: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
e6f0: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
e700: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
e710: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
e720: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
e730: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
e740: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
e750: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
e760: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
e770: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
e780: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
e790: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
e7a0: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
e7b0: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
e7c0: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
e7d0: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
e7e0: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
e7f0: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
e800: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
e810: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
e820: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
e830: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
e840: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e850: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
e860: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
e870: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
e880: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e890: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
e8a0: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
e8b0: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
e8c0: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
e8d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
e8e0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
e8f0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
e900: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
e910: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
e920: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
e930: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
e940: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
e950: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
e960: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
e970: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
e980: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
e990: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
e9a0: 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
e9b0: 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
e9c0: 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
e9d0: 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
e9e0: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
e9f0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
ea00: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
ea10: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
ea20: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
ea30: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
ea40: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
ea50: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
ea60: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
ea70: 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  me);.      MUTEX
ea80: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
ea90: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
eaa0: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73  ed; ).      p->s
eab0: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
eac0: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
ead0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
eae0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
eaf0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
eb00: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
eb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
eb20: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
eb30: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
eb40: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
eb50: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
eb60: 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
eb70: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
eb80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
eb90: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
eba0: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
ebb0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
ebe0: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
ebf0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
ec00: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
ec10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ec20: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
ec30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ec40: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
ec50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ec60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ec70: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
ec80: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
ec90: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
eca0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ecb0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
ecc0: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
ecd0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ece0: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
ecf0: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
ed00: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
ed10: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
ed20: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
ed30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ed40: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
ed50: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
ed60: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
ed70: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
ed80: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ed90: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
eda0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
edb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
edc0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
edd0: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
ede0: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
edf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
ee00: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
ee10: 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
ee20: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
ee30: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
ee40: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
ee50: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ee60: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
ee70: 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
ee80: 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
ee90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
eea0: 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
eeb0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
eec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
eed0: 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
eee0: 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
eef0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
ef00: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
ef10: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
ef20: 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
ef30: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
ef40: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
ef50: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
ef60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ef70: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ef90: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
efb0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
efc0: 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
efd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
efe0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
eff0: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
f000: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
f010: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f030: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
f040: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
f050: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
f060: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
f070: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f080: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
f090: 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
f0a0: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
f0b0: 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
f0c0: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
f0d0: 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
f0e0: 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
f0f0: 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
f100: 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
f110: 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
f120: 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
f130: 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
f140: 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
f150: 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
f160: 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
f170: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
f180: 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
f190: 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
f1a0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
f1b0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
f1c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
f1d0: 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
f1e0: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
f1f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f200: 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
f210: 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
f220: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
f230: 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
f240: 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
f250: 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
f260: 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
f270: 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
f280: 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
f290: 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
f2a0: 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
f2b0: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
f2c0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
f2d0: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
f2e0: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
f2f0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f300: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
f310: 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
f320: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f330: 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
f340: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
f350: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
f360: 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
f370: 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
f380: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
f390: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
f3a0: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
f3b0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
f3c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f3d0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
f3e0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f3f0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
f400: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
f410: 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
f420: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
f450: 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
f460: 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
f470: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f480: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
f490: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f4a0: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
f4b0: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
f4c0: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
f4d0: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
f4e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f4f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
f500: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f510: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
f520: 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75  ->openFlags = (u
f530: 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74  8)flags;.    pBt
f540: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
f550: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
f560: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
f570: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
f580: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
f590: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
f5a0: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42  = pBt;.  .    pB
f5b0: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
f5c0: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
f5d0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
f5e0: 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
f5f0: 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
f600: 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
f610: 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
f620: 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  Y;.#ifdef SQLITE
f630: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
f640: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
f650: 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
f660: 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20  ELETE;.#endif.  
f670: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
f680: 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
f690: 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
f6a0: 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
f6b0: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
f6c0: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
f6d0: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
f6e0: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
f6f0: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
f700: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
f710: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
f720: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
f730: 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
f740: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f750: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
f760: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
f770: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
f780: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
f790: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
f7a0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
f7b0: 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
f7c0: 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
f7d0: 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
f7e0: 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
f7f0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
f800: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
f810: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
f820: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
f830: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
f840: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
f850: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
f860: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
f870: 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
f880: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
f890: 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
f8a0: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
f8b0: 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
f8c0: 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
f8d0: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
f8e0: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
f8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
f900: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
f910: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
f920: 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
f930: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
f940: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
f950: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
f960: 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
f970: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
f980: 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
f990: 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
f9a0: 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  e{.      nReserv
f9b0: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
f9c0: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
f9d0: 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
f9e0: 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
f9f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fa00: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
fa10: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
fa20: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
fa30: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
fa40: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
fa50: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
fa60: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
fa70: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
fa80: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
fa90: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
faa0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
fab0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
fac0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
fad0: 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
fae0: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
faf0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
fb00: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
fb10: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
fb20: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
fb30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
fb40: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
fb50: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
fb60: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
fb70: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
fb80: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
fb90: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
fba0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
fbb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
fbc0: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
fbd0: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
fbe0: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
fbf0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
fc00: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
fc10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
fc20: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
fc30: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
fc40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
fc50: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
fc60: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
fc70: 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   1;.      MUTEX_
fc80: 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72  LOGIC( mutexShar
fc90: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
fca0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
fcb0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
fcc0: 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53  R);).      if( S
fcd0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
fce0: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
fcf0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
fd00: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
fd10: 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
fd20: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
fd30: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
fd40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
fd50: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
fd60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
fd70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
fd80: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
fd90: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  ailed = 0;.     
fda0: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
fdb0: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
fdc0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fdd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fde0: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
fdf0: 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
fe00: 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
fe10: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fe20: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
fe30: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
fe40: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fe50: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
fe60: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
fe70: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fe80: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
fe90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
fea0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
feb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
fec0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
fed0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fee0: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
fef0: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
ff00: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
ff10: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
ff20: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
ff30: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
ff40: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
ff50: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
ff60: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
ff70: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
ff80: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
ff90: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
ffa0: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
ffb0: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
ffc0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
ffd0: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
ffe0: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
fff0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
10000 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
10010 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
10020 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
10030 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
10040 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
10050 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
10060 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
10070 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
10080 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
10090 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
100a0 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
100b0 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
100c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
100d0 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
100e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
100f0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
10100 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
10110 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
10120 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
10130 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
10140 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
10150 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
10160 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
10170 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
10180 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
10190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
101a0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
101b0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
101c0 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
101d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
101e0 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
101f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10210 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
10220 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
10230 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
10240 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
10250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10260 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
10270 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
10280 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
10290 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
102a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
102b0 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
102c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
102d0 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
102e0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
102f0 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
10300 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
10310 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
10320 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
10330 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ize to the.    *
10340 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  * default value.
10350 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70   Except, when op
10360 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73  ening on an exis
10370 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
10380 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20  r-cache,.    ** 
10390 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
103a0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
103b0 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
103c0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  f( sqlite3BtreeS
103d0 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d  chema(p, 0, 0)==
103e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
103f0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
10400 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ize(p->pBt->pPag
10410 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
10420 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a  LT_CACHE_SIZE);.
10430 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10440 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
10450 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10460 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
10470 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
10480 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10490 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
104a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
104b0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
104c0 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
104d0 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
104e0 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
104f0 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
10500 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
10510 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
10520 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
10530 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
10540 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
10550 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
10560 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
10570 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
10580 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
10590 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
105a0 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
105b0 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
105c0 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
105d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
105e0 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f  D_CACHE.  MUTEX_
105f0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
10600 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10610 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
10620 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
10630 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
10640 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10650 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
10660 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c  ex) );.  MUTEX_L
10670 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
10680 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
10690 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
106a0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
106b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
106c0 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
106d0 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
106e0 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
106f0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
10700 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10710 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10720 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
10730 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
10740 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
10750 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
10760 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
10770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
10780 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
10790 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
107a0 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
107b0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
107c0 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
107d0 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
107e0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
107f0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
10800 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10810 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
10820 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
10830 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
10840 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
10850 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
10860 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
10870 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10880 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
10890 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
108a0 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
108b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
108c0 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
108d0 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
108e0 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
108f0 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
10900 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
10910 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
10920 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
10930 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
10940 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
10950 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
10960 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
10970 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
10980 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
10990 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
109a0 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
109b0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
109c0 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
109d0 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Size );.  }.}../
109e0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
109f0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
10a00 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
10a10 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
10a20 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
10a30 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
10a40 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
10a50 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
10a60 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
10a70 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
10a80 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
10a90 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
10aa0 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
10ab0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
10ac0 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
10ad0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10ae0 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
10af0 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
10b00 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
10b10 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
10b20 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
10b30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10b40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
10b50 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
10b60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10b70 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
10b80 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
10b90 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
10ba0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
10bb0 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
10bc0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
10bd0 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
10be0 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
10bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
10c00 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
10c10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10c20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
10c30 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
10c40 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
10c50 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
10c60 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
10c70 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
10c80 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
10c90 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
10ca0 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
10cb0 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
10cc0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10cd0 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  ck(p, SQLITE_OK)
10ce0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10cf0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
10d00 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
10d10 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
10d20 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
10d30 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
10d40 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
10d50 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
10d60 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
10d70 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
10d80 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
10d90 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
10da0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
10db0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
10dc0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
10dd0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
10de0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
10df0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
10e00 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
10e10 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
10e20 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
10e30 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
10e40 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
10e50 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
10e60 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
10e70 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
10e80 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
10e90 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
10ea0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
10eb0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
10ec0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
10ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
10ee0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
10ef0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
10f00 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
10f10 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
10f20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
10f30 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
10f40 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
10f50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10f60 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
10f70 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
10f80 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
10f90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
10fa0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
10fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10fc0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
10fd0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
10fe0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10ff0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
11000 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
11010 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
11020 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
11030 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
11040 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
11050 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
11060 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
11070 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
11080 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11090 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
110a0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
110b0 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
110c0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
110d0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
110e0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
110f0 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
11100 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
11110 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
11120 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
11130 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
11140 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
11150 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
11160 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
11170 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
11180 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
11190 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
111a0 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
111b0 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
111c0 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
111d0 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
111e0 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
111f0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
11200 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
11210 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
11220 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
11230 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
11240 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
11250 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
11260 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
11270 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
11280 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
11290 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
112a0 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
112b0 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
112c0 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
112d0 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
112e0 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
112f0 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
11300 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
11310 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
11320 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
11330 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
11340 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
11350 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
11360 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
11370 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
11380 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11390 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
113a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
113b0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
113c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
113d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
113e0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
113f0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
11400 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
11410 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11420 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11430 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11440 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
11450 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
11460 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
11470 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
11480 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
11490 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
114a0 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
114b0 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
114c0 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
114d0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
114e0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
114f0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
11500 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
11510 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
11520 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
11530 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
11540 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
11550 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
11560 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
11570 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
11580 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
11590 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
115a0 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
115b0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
115c0 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
115d0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
115e0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
115f0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
11600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11610 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
11620 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
11630 65 74 79 4c 65 76 65 6c 28 0a 20 20 42 74 72 65  etyLevel(.  Btre
11640 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
11650 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11660 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
11670 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
11680 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20 20 20  int level,      
11690 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
116a0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31   synchronous.  1
116b0 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20  =OFF, 2=NORMAL, 
116c0 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  3=FULL */.  int 
116d0 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20 20 20 20  fullSync,       
116e0 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c     /* PRAGMA ful
116f0 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20 69 6e 74  lfsync. */.  int
11700 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63 20 20 20   ckptFullSync   
11710 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 63 68      /* PRAGMA ch
11720 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 79 6e  eckpoint_fullfyn
11730 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  c */.){.  BtShar
11740 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11750 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11760 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11770 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
11780 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
11790 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
117a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
117b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
117c0 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
117d0 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
117e0 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
117f0 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c 53 79 6e  ync, ckptFullSyn
11800 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
11810 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11830 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
11840 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11850 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
11860 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
11870 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
11880 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
11890 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
118a0 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
118b0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
118c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
118d0 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
118e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
118f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11900 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
11910 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11920 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
11930 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
11940 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11950 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
11960 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
11970 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
11980 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
11990 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
119a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
119b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
119c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
119d0 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
119e0 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
119f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
11a00 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
11a10 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
11a20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
11a30 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
11a40 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
11a50 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
11a60 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
11a70 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
11a80 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
11a90 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
11aa0 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
11ab0 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
11ac0 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
11ad0 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
11ae0 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
11af0 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
11b00 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
11b10 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
11b20 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
11b30 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
11b40 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
11b50 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
11b60 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
11b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
11b80 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
11b90 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
11ba0 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
11bb0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
11bc0 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
11bd0 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
11be0 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
11bf0 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
11c00 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
11c10 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
11c20 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
11c30 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
11c40 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
11c50 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
11c60 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
11c70 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
11c80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
11c90 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
11ca0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
11cb0 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
11cc0 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
11cd0 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
11ce0 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
11cf0 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
11d00 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11d10 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
11d20 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11d30 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
11d40 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
11d50 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11d60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
11d70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11d80 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
11d90 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
11da0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11db0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11dc0 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
11dd0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
11de0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
11df0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
11e00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
11e10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
11e20 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
11e30 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
11e40 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
11e50 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
11e60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
11e70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
11e80 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
11e90 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11ea0 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
11eb0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
11ec0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11ed0 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
11ee0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
11ef0 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
11f00 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
11f10 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
11f20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
11f30 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
11f40 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
11f50 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
11f60 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
11f70 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
11f80 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
11f90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11fa0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11fb0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
11fc0 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
11fd0 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
11fe0 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
11ff0 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
12000 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
12010 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
12020 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
12030 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
12040 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12050 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12060 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
12070 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
12080 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
12090 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
120a0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
120b0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
120c0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
120d0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
120e0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
120f0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
12100 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
12110 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12120 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
12130 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
12140 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
12150 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
12160 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
12170 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
12180 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
12190 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
121a0 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
121b0 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
121c0 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
121d0 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
121e0 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
121f0 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
12200 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
12210 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
12220 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
12230 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
12240 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
12250 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
12260 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
12270 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
12280 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
12290 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
122a0 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
122b0 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
122c0 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
122d0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
122e0 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
122f0 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
12300 20 62 65 68 61 76 69 6f 75 72 2e 0a 2a 2f 0a 69   behaviour..*/.i
12310 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12320 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
12330 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
12340 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12350 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
12360 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
12370 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
12380 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
12390 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e  sableSize;.}.#en
123a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41  dif /* SQLITE_HA
123b0 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54  S_CODEC || SQLIT
123c0 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20  E_DEBUG */..#if 
123d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
123e0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
123f0 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
12400 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
12410 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UM)./*.** Return
12420 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
12430 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
12440 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
12450 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
12460 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
12470 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
12480 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
12490 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
124a0 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
124b0 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
124c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
124d0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
124e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
124f0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
12500 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
12510 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
12520 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
12530 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
12540 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12550 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
12560 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
12570 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
12580 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
12590 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
125a0 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
125b0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
125c0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
125d0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
125e0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
125f0 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
12600 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
12610 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
12620 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12630 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
12640 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
12650 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
12660 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12670 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
12680 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
12690 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
126a0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
126b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
126c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
126d0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
126e0 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
126f0 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
12700 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
12710 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
12720 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
12730 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
12740 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
12750 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
12760 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
12770 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
12780 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
12790 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
127a0 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
127b0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
127c0 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
127d0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
127e0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
127f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
12800 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
12810 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
12820 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
12830 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
12840 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
12850 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
12860 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
12870 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
12880 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
12890 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
128a0 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
128b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
128c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
128d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
128e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
128f0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
12900 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
12910 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20  TE_OMIT_VACUUM) 
12920 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
12930 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
12940 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
12950 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
12960 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
12970 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
12980 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
12990 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
129a0 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
129b0 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
129c0 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
129d0 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
129e0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
129f0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
12a00 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
12a10 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
12a20 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
12a30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12a40 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
12a50 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
12a60 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
12a70 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12a80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
12a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
12aa0 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
12ab0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
12ac0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
12ad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
12ae0 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
12af0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
12b00 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12b10 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
12b20 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
12b30 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
12b40 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
12b50 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12b60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
12b70 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
12b80 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
12b90 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
12ba0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
12bb0 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
12bc0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
12bd0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12be0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
12bf0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
12c00 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
12c10 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
12c20 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
12c30 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
12c40 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
12c50 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
12c60 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
12c70 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
12c80 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
12c90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12ca0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12cb0 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
12cc0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
12cd0 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
12ce0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12cf0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
12d00 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
12d10 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
12d20 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
12d30 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
12d40 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
12d50 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
12d60 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
12d70 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
12d80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12d90 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12da0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
12db0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
12dc0 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
12dd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12de0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
12df0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
12e00 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
12e10 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
12e20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
12e30 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
12e40 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
12e50 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
12e60 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
12e70 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
12e80 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
12e90 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
12ea0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
12eb0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
12ec0 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
12ed0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
12ee0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
12ef0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
12f00 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
12f10 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
12f20 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
12f30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12f40 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12f50 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
12f60 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
12f70 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
12f80 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
12f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
12fa0 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
12fb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12fc0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
12fd0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
12fe0 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
12ff0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
13000 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
13010 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
13020 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
13030 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
13040 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
13050 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
13060 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
13070 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13080 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
13090 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
130a0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
130b0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
130c0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
130d0 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
130e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
130f0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
13100 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
13110 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
13120 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
13130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13140 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
13150 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
13160 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
13170 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
13180 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
13190 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
131a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
131b0 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
131c0 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
131d0 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
131e0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
131f0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
13200 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
13210 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
13220 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
13230 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
13240 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
13250 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
13260 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
13270 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
13280 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
13290 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
132a0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
132b0 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
132c0 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
132d0 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
132e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
132f0 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
13300 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
13310 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
13320 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
13330 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13340 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
13350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
13360 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
13370 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
13380 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13390 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
133a0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
133b0 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
133c0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
133d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
133e0 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
133f0 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
13400 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
13410 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
13420 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13430 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
13440 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
13450 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
13460 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
13470 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
13480 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
13490 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
134a0 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
134b0 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
134c0 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
134d0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
134e0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
134f0 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
13500 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
13510 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
13520 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
13530 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
13540 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
13550 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
13560 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
13570 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
13580 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
13590 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
135a0 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
135b0 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
135c0 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
135d0 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
135e0 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
135f0 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
13600 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
13610 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
13620 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13630 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
13640 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
13650 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
13660 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
13670 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
13680 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
13690 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
136a0 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
136b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
136c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
136d0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
136e0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
136f0 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d  else if( isOpen=
13700 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
13710 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
13720 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
13730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
13740 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
13750 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
13760 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
13770 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
13780 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
13790 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  n must be exactl
137a0 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20  y 25%.  And the 
137b0 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65  minimum.    ** e
137c0 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
137d0 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66   must be 12.5% f
137e0 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74  or both leaf-dat
137f0 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64  a and non-leaf-d
13800 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ata..    ** The 
13810 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
13820 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
13830 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
13840 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
13850 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
13860 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
13870 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
13880 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
13890 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
138a0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
138b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
138c0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
138d0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
138e0 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
138f0 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
13900 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
13910 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
13920 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
13930 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
13940 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
13950 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
13960 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
13970 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13980 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13990 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
139a0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
139b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62  )==0 );.    usab
139c0 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
139d0 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
139e0 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
139f0 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
13a00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
13a10 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
13a20 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
13a30 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
13a40 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
13a50 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
13a60 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
13a70 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
13a80 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
13a90 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
13aa0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
13ab0 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
13ac0 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
13ad0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
13ae0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
13af0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
13b00 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
13b10 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
13b20 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
13b30 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
13b40 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
13b50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13b60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
13b70 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
13b80 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
13b90 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
13ba0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
13bb0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
13bc0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
13bd0 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
13be0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
13bf0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
13c00 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
13c10 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
13c40 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
13c50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13c60 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74    }.    if( (pBt
13c70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
13c80 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64  LITE_RecoveryMod
13c90 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  e)==0 && nPage>n
13ca0 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
13cb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
13cc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
13cd0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13ce0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13cf0 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
13d00 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
13d10 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13d20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
13d30 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
13d40 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
13d50 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
13d60 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
13d70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13d80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13d90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13da0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
13db0 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
13dc0 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
13dd0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
13de0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
13df0 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
13e00 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
13e10 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
13e20 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
13e30 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
13e40 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
13e50 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
13e60 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
13e70 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
13e80 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
13e90 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
13ea0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
13eb0 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
13ec0 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
13ed0 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
13ee0 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
13ef0 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
13f00 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
13f10 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
13f20 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
13f30 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
13f40 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
13f50 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
13f60 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
13f70 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
13f80 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
13f90 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
13fa0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
13fb0 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
13fc0 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
13fd0 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
13fe0 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
13ff0 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
14000 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
14010 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
14020 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
14030 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
14040 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
14050 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
14060 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
14070 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
14080 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
14090 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
140a0 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
140b0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
140c0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
140d0 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
140e0 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
140f0 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
14100 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
14110 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
14120 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
14130 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
14140 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
14150 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
14160 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
14170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
14180 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
14190 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
141a0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
141b0 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
141c0 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
141d0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
141e0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
141f0 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
14200 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
14210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14220 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
14230 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
14240 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
14250 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
14260 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14270 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
14280 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
14290 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
142a0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
142b0 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
142c0 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
142d0 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
142e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
142f0 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
14300 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
14310 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
14320 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14330 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
14340 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
14350 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
14360 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
14370 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
14380 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
14390 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
143a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
143b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
143c0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
143d0 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
143e0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
143f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14400 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14410 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75  assert( pBt->pCu
14420 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  rsor==0 || pBt->
14430 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
14440 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
14450 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
14460 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
14470 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
14480 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
14490 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
144a0 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
144b0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
144c0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
144d0 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20  ager)==1 );.    
144e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
144f0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
14500 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
14510 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
14520 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
14530 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
14540 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
14550 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
14560 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
14570 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
14580 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
14590 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
145a0 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
145b0 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
145c0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
145d0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
145e0 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
145f0 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
14600 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
14610 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
14620 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
14630 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14640 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
14650 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
14660 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
14670 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14680 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
14690 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
146a0 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
146b0 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
146c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
146d0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
146e0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
146f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14700 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
14710 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
14720 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
14730 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
14740 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
14750 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
14760 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
14770 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
14780 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
14790 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
147a0 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
147b0 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
147c0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
147d0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
147e0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
147f0 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
14800 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
14810 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
14820 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
14830 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
14840 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
14850 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
14860 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
14870 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
14880 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
14890 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
148a0 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
148b0 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
148c0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
148d0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
148e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
148f0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
14900 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
14910 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
14920 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
14930 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
14940 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
14950 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
14960 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
14970 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
14980 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
14990 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
149a0 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
149b0 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
149c0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
149d0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
149e0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
149f0 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
14a00 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
14a10 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
14a20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14a30 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
14a40 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
14a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14a60 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
14a70 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
14a80 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
14a90 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
14aa0 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
14ab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
14ac0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
14ad0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
14ae0 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
14af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14b00 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
14b10 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
14b20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14b30 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
14b40 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
14b50 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
14b60 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
14b70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14b80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14b90 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
14ba0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
14bb0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
14bc0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
14bd0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
14be0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
14bf0 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
14c00 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
14c10 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
14c20 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
14c30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
14c40 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
14c50 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
14c60 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
14c70 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
14c80 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
14c90 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
14ca0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
14cb0 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
14cc0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
14cd0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
14ce0 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
14cf0 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
14d00 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
14d10 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
14d20 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
14d30 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
14d40 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
14d50 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
14d60 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
14d70 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
14d80 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
14d90 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
14da0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14db0 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
14dc0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
14dd0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
14de0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
14df0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
14e00 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
14e10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
14e20 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
14e30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
14e40 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
14e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14e60 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
14e70 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
14e80 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
14e90 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
14ea0 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
14eb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
14ec0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
14ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
14ee0 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
14ef0 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
14f00 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
14f10 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
14f20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
14f30 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
14f40 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
14f50 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
14f60 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
14f70 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
14f80 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
14f90 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
14fa0 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
14fb0 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
14fc0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
14fd0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
14fe0 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
14ff0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
15000 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
15010 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
15020 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
15030 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
15040 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
15050 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
15060 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
15070 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
15080 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
15090 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
150a0 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
150b0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
150c0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
150d0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
150e0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
150f0 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
15100 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
15110 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
15120 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
15130 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
15140 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
15150 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
15160 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
15170 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
15180 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
15190 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
151a0 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
151b0 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
151c0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
151d0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
151e0 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
151f0 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
15200 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
15210 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
15220 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
15230 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
15240 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
15250 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
15260 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
15270 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
15280 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
15290 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
152a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
152b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
152c0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
152d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
152e0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
152f0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
15300 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
15310 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
15320 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
15330 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
15340 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
15350 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
15360 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
15370 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
15380 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
15390 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
153a0 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
153b0 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
153c0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
153d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 49 66    }.  assert( If
153e0 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
153f0 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
15400 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  ;..  /* Write tr
15410 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
15420 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
15430 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
15440 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
15450 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
15460 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
15470 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
15480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
15490 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
154a0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
154b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
154c0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
154d0 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
154e0 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
154f0 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
15500 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
15510 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
15520 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
15530 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
15540 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
15550 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
15560 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
15570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
15580 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
15590 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
155a0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
155b0 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
155c0 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
155d0 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
155e0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42  )!=0.  ){.    pB
155f0 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
15600 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
15610 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
15620 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
15630 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
15640 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
15650 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
15660 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
15670 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
15680 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
15690 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
156a0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
156b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
156c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
156d0 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
156e0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
156f0 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
15700 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
15710 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
15720 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
15730 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
15740 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
15750 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
15760 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
15770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
15780 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
15790 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
157a0 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
157b0 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
157c0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
157d0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
157e0 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
157f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15800 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
15810 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
15820 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
15830 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
15840 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
15850 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
15860 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
15870 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
15880 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
15890 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
158a0 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
158b0 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
158c0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
158d0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
158e0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
158f0 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
15900 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
15910 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
15920 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
15930 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
15940 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
15950 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
15960 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
15970 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
15980 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
15990 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
159a0 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
159b0 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
159c0 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
159d0 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
159e0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
159f0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
15a00 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
15a10 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
15a20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
15a30 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
15a40 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
15a50 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
15a60 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
15a70 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
15a80 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
15a90 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
15aa0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
15ab0 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
15ac0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
15ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
15ae0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
15af0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
15b00 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
15b10 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
15b20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
15b30 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
15b40 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
15b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
15b60 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
15b70 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
15b80 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
15b90 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
15ba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
15bc0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
15bd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15be0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
15bf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
15c10 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
15c20 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
15c30 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
15c40 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
15c50 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15c60 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
15c70 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
15c80 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
15c90 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
15ca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15cb0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
15cc0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
15cd0 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
15ce0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
15cf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d00 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15d10 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
15d20 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
15d30 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
15d40 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
15d50 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
15d60 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
15d70 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
15d80 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
15d90 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
15da0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
15db0 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
15dc0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
15dd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
15de0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
15df0 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
15e00 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
15e10 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
15e20 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
15e30 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
15e40 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15e50 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
15e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15e70 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
15e80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
15e90 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
15ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15eb0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
15ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
15ed0 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
15ee0 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
15ef0 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
15f00 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
15f10 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
15f20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
15f30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
15f40 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
15f50 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
15f60 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
15f70 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
15f80 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
15f90 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
15fa0 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
15fb0 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
15fc0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
15fd0 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
15fe0 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
15ff0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
16000 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
16010 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
16020 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
16030 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
16040 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
16050 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
16060 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
16070 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
16080 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
16090 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
160a0 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
160b0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
160c0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
160d0 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
160e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
160f0 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
16100 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16110 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
16120 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
16130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
16150 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
16160 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
16170 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
16180 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16190 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
161a0 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
161b0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
161c0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
161d0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
161e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
161f0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
16200 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
16210 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
16220 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
16230 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
16240 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
16250 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
16260 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
16270 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
16280 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
16290 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
162a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
162b0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
162c0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
162d0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
162e0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
162f0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
16300 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16310 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16320 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
16330 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16340 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
16350 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
16360 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
16370 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
16380 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
16390 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
163a0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
163b0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
163c0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
163d0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
163e0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
163f0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
16400 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
16410 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
16420 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
16430 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
16460 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
16470 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
164a0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
164b0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
164c0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
164f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16500 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
16510 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
16520 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
16530 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
16540 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
16550 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16560 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
16570 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
16580 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
16590 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
165a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
165b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
165c0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
165d0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
165e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
165f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
16600 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
16610 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
16620 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
16630 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
16640 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
16650 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
16660 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
16670 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
16680 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
16690 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
166a0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
166b0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
166c0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
166d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
166e0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
166f0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
16700 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
16710 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16720 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
16730 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
16740 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
16750 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
16760 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
16770 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
16780 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
16790 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
167a0 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
167b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
167c0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
167d0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
167e0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
167f0 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
16800 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
16810 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
16820 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
16830 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
16840 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
16850 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
16860 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
16870 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
16880 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
16890 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
168a0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
168b0 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
168e0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
168f0 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
16900 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
16910 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
16920 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
16930 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16940 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
16950 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
16960 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
16970 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
16980 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
16990 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
169a0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
169b0 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
169c0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
169d0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
169e0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
169f0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
16a00 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
16a10 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
16a20 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
16a30 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
16a40 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
16a50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16a60 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
16a70 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
16a80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
16a90 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
16aa0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
16ab0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
16ac0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
16ad0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
16ae0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
16af0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16b00 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
16b10 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
16b20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
16b30 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
16b40 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
16b50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16b60 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
16b70 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
16b80 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
16b90 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
16ba0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
16bb0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
16bc0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
16bd0 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
16be0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
16bf0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
16c00 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
16c10 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
16c20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
16c30 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
16c40 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
16c50 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
16c60 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
16c70 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
16c80 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
16c90 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
16ca0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
16cb0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
16cc0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
16cd0 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ow.         && p
16ce0 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
16cf0 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44  low+3<=pPage->aD
16d00 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
16d10 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  age.         && 
16d20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
16d30 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
16d40 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20  rflow]).        
16d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
16d60 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
16d70 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
16d80 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
16d90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
16da0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16db0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
16dc0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
16dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
16de0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
16df0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16e00 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
16e10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
16e20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
16e30 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
16e40 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
16e50 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
16e60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
16e70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
16e80 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
16e90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16ea0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16eb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
16ec0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
16ed0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
16ee0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
16ef0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
16f00 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
16f10 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
16f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16f30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
16f40 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
16f50 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
16f60 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
16f70 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
16f80 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
16f90 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
16fa0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
16fb0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
16fc0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
16fd0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
16fe0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
16ff0 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
17000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
17010 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
17020 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
17030 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
17040 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
17050 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
17060 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
17070 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
17080 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
17090 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
170a0 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
170b0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
170c0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
170d0 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
170e0 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
170f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
17100 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
17110 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
17120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
17130 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
17140 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
17150 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
17160 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
17170 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
17180 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
17190 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
171a0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
171b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
171c0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
171d0 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
171e0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
171f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
17200 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
17210 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
17220 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
17230 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
17240 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
17250 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
17260 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
17270 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
17280 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
17290 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
172a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
172b0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
172c0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
172d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
172e0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
172f0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
17300 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
17310 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
17320 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
17330 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
17340 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17350 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
17360 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
17370 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
17380 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
17390 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
173a0 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
173b0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
173c0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
173d0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
173e0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
173f0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
17400 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
17410 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
17420 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
17430 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
17440 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
17450 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17460 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
17470 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
17480 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
17490 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
174a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
174b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
174c0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
174d0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
174e0 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
174f0 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
17500 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
17510 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
17520 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
17530 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
17540 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
17550 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
17560 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
17570 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
17580 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
17590 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
175a0 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
175b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
175c0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
175d0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
175e0 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
175f0 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
17600 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
17610 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
17620 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
17630 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
17640 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
17650 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
17660 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
17670 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
17680 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
17690 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
176a0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
176b0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
176c0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
176d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
176e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
176f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17700 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
17710 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
17720 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
17730 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
17740 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
17750 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
17760 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
17770 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
17780 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
17790 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
177a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
177b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
177c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
177d0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
177e0 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
177f0 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
17800 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
17810 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
17820 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
17830 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
17840 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
17850 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
17860 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
17870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
17880 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
17890 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
178a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
178b0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
178c0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
178d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
178e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
178f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
17900 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
17910 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
17920 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
17930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17940 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
17950 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
17960 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17970 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
17980 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
17990 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
179a0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
179b0 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
179c0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
179d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
179e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
179f0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
17a00 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
17a10 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
17a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17a30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
17a40 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
17a50 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
17a60 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
17a70 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
17a80 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
17a90 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
17aa0 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
17ab0 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
17ac0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
17ad0 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
17ae0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
17af0 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
17b00 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
17b10 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
17b20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
17b30 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
17b40 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
17b50 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
17b60 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
17b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
17b80 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
17b90 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
17ba0 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
17bb0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
17bc0 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c  * More specificl
17bd0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
17be0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
17bf0 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
17c00 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
17c10 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
17c20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
17c30 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
17c40 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
17c50 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
17c60 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
17c70 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
17c80 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
17c90 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
17ca0 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
17cb0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
17cc0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
17cd0 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
17ce0 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
17cf0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
17d00 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
17d10 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
17d20 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
17d30 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
17d40 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
17d50 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
17d60 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
17d70 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
17d80 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
17d90 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
17da0 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
17db0 6d 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  mmmit .** operat
17dc0 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
17dd0 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
17de0 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
17df0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
17e00 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
17e10 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
17e20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
17e30 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
17e40 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
17e50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17e60 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
17e70 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
17e80 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
17e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17ea0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17eb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
17ec0 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
17ed0 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
17ee0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17ef0 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
17f00 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
17f10 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
17f20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
17f30 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
17f40 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
17f50 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
17f60 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
17f70 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
17f80 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
17f90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17fa0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
17fb0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
17fc0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
17fd0 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
17fe0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
17ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18010 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
18020 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
18030 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
18040 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18050 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
18060 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
18070 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
18080 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
18090 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
180a0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
180b0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
180c0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
180d0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
180e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
180f0 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
18100 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
18110 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
18120 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
18130 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
18140 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
18150 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
18160 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
18170 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
18180 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
18190 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
181a0 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
181b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
181c0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
181d0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
181e0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
181f0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
18200 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
18210 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
18220 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
18230 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
18240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18260 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
18280 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
18290 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
182a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
182b0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
182c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
182d0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
182e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
182f0 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
18300 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
18310 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
18320 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
18330 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
18340 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
18350 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
18360 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
18370 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
18380 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
18390 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
183a0 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
183b0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
183c0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
183d0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
183e0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
183f0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
18400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18420 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18430 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18440 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
18450 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
18460 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
18470 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
18480 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
18490 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
184a0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
184b0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
184c0 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
184d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
184e0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
184f0 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
18500 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
18510 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
18520 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
18530 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
18540 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
18550 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
18560 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
18570 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
18580 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18590 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
185a0 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
185b0 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
185c0 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
185d0 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
185e0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
185f0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
18600 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
18610 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
18620 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
18630 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
18640 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
18650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18660 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
18670 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
18680 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
18690 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
186a0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
186b0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
186c0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
186d0 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
186e0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
186f0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
18700 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
18710 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
18720 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
18730 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
18740 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
18750 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
18760 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18770 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
18780 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18790 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
187a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
187b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
187c0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
187d0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
187e0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
187f0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
18800 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18810 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
18820 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
18830 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
18840 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
18850 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
18860 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
18870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
18890 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
188a0 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
188b0 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
188c0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
188d0 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
188e0 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
188f0 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
18900 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
18910 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
18920 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18930 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
18940 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
18950 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
18960 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
18970 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
18980 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
18990 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
189a0 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
189d0 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
189e0 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
189f0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
18a20 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
18a30 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
18a40 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
18a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18a60 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
18a70 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
18a80 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
18a90 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
18aa0 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
18ab0 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
18ac0 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
18ad0 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
18ae0 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
18af0 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
18b00 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18b10 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
18b20 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18b30 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
18b40 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
18b50 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
18b60 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
18b70 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
18b80 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
18b90 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
18ba0 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
18bb0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
18bc0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
18bd0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
18be0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
18bf0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
18c00 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
18c10 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
18c20 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
18c30 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
18c40 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
18c50 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
18c60 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
18c70 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
18c80 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
18c90 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
18ca0 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
18cb0 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
18cc0 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
18cd0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18ce0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18cf0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
18d00 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
18d10 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
18d20 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
18d30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
18d40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18d50 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
18d60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18d70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
18d80 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
18d90 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
18da0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
18db0 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
18dc0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
18dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18de0 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
18df0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
18e00 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
18e10 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
18e20 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
18e30 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
18e40 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
18e50 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
18e60 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
18e70 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
18e80 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
18e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18ea0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18eb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
18ec0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ree>0 ){.      i
18ed0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
18ee0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
18ef0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
18f00 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
18f10 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
18f20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18f50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
18f60 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
18f70 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
18f80 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
18f90 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
18fa0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
18fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18fc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
18fd0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
18fe0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18ff0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
19000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19010 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19020 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
19030 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
19040 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
19050 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
19060 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
19070 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
19080 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
19090 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
190a0 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
190b0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
190c0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
190d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
190e0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
190f0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
19100 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
19110 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
19120 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
19130 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
19140 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
19150 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
19160 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
19170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
19180 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
19190 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
191a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
191b0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
191c0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
191d0 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
191e0 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
191f0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
19200 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
19210 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19220 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
19230 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
19240 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
19250 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
19260 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
19270 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
19280 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
19290 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
192a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
192b0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
192c0 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
192d0 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
192e0 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
192f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19300 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
19310 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
19320 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
19330 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
19340 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
19350 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
19360 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
19370 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
19380 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
19390 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
193a0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
193b0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
193c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
193d0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
193e0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
193f0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
19400 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
19410 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
19420 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
19430 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
19440 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
19450 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
19460 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
19470 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
19480 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
19490 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
194a0 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
194b0 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
194c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
194d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
194e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
194f0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
19500 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
19510 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
19520 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
19530 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
19540 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
19550 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
19560 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19570 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
19580 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
19590 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
195a0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
195b0 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
195c0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
195d0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
195e0 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
195f0 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
19600 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
19610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
19620 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
19630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19640 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
19650 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
19660 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
19670 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19680 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
19690 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
196a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
196b0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
196c0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
196d0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
196e0 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
196f0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
19700 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
19710 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
19720 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19740 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
19750 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19760 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
19770 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33  t( nRef==sqlite3
19780 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
19790 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
197a0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
197b0 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
197c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
197d0 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
197e0 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
197f0 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
19800 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19810 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
19820 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
19830 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
19840 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
19850 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
19860 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
19870 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
19880 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
19890 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
198a0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
198b0 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
198c0 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
198d0 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
198e0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
198f0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
19900 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
19910 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
19920 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
19930 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
19940 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
19950 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
19960 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
19970 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
19980 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
19990 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
199a0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
199b0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
199c0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
199d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
199e0 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
199f0 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
19a00 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
19a10 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
19a20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
19a30 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
19a40 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
19a50 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
19a60 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
19a70 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
19a80 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
19a90 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
19aa0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
19ab0 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
19ac0 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
19ad0 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
19ae0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
19af0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
19b00 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
19b10 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
19b20 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
19b30 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
19b40 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
19b50 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
19b60 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
19b70 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
19b80 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
19b90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19ba0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
19bb0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
19bc0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
19bd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
19be0 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
19bf0 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
19c00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
19c10 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
19c20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
19c30 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
19c40 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
19c50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
19c60 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
19c70 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
19c80 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
19c90 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
19ca0 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
19cb0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
19cc0 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
19cd0 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
19ce0 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
19cf0 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
19d00 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
19d10 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
19d20 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
19d30 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
19d40 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
19d50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19d60 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
19d70 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
19d80 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
19d90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19da0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
19db0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
19dc0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
19dd0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19de0 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
19df0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
19e00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19e10 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
19e20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
19e30 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
19e40 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
19e50 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
19e60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19e70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
19e80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19e90 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
19ea0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
19eb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
19ec0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
19ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
19ee0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
19ef0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
19f00 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
19f10 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
19f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
19f30 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
19f40 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
19f50 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
19f60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19f70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
19f90 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
19fa0 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
19fb0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
19fc0 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
19fd0 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
19fe0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
19ff0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1a000 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
1a010 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1a020 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1a030 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a040 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
1a050 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1a060 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
1a070 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a080 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
1a090 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1a0a0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 62 74 72   0;.#endif.  btr
1a0b0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
1a0c0 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70 2d  t(pBt);.  if( p-
1a0d0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1a0e0 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63  ONE && p->db->ac
1a0f0 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b  tiveVdbeCnt>1 ){
1a100 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1a110 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
1a120 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
1a130 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
1a140 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1a150 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
1a160 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
1a170 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
1a180 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
1a190 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
1a1a0 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
1a1b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1a1c0 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
1a1d0 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
1a1e0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1a1f0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1a200 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1a210 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
1a220 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
1a230 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
1a240 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
1a250 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
1a260 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1a270 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
1a280 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
1a290 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1a2a0 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
1a2b0 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
1a2c0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1a2d0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
1a2e0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1a2f0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
1a300 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
1a310 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
1a320 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
1a330 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
1a340 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
1a350 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1a360 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1a370 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1a380 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
1a390 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
1a3a0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
1a3b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a3c0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
1a3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a3e0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1a3f0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1a400 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
1a410 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
1a420 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
1a430 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
1a440 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
1a450 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
1a460 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
1a470 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1a480 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1a490 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1a4a0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
1a4b0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1a4c0 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
1a4d0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1a4e0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
1a4f0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
1a500 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a510 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
1a520 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
1a530 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
1a540 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
1a550 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1a560 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
1a570 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1a580 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
1a590 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
1a5a0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
1a5b0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
1a5c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a5d0 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
1a5e0 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
1a5f0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
1a600 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1a610 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
1a620 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
1a630 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
1a640 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
1a650 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
1a660 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
1a670 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
1a680 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
1a690 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
1a6a0 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
1a6b0 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
1a6c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1a6d0 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
1a6e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
1a6f0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
1a700 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
1a710 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1a720 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1a730 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
1a740 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
1a750 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
1a760 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1a770 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
1a780 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1a790 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
1a7a0 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
1a7b0 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
1a7c0 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
1a7d0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
1a7e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
1a7f0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
1a800 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
1a810 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
1a820 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
1a830 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
1a840 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
1a850 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1a860 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1a870 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
1a880 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
1a890 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a8a0 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
1a8b0 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
1a8c0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
1a8d0 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
1a8e0 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
1a8f0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
1a900 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
1a910 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
1a920 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
1a930 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
1a940 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1a950 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
1a960 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
1a970 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
1a980 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
1a990 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
1a9a0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
1a9b0 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
1a9c0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
1a9d0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1a9e0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1a9f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1aa00 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1aa10 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1aa20 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1aa30 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1aa40 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1aa50 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1aa60 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
1aa70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
1aa80 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1aa90 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1aaa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1aab0 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
1aac0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1aad0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1aae0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
1aaf0 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
1ab00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1ab10 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
1ab20 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
1ab30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1ab40 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1ab50 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
1ab60 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
1ab70 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1ab80 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1ab90 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
1aba0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1abb0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1abc0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1abd0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1abe0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1abf0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
1ac00 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
1ac10 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1ac20 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
1ac30 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1ac40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1ac50 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
1ac60 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1ac70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1ac80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ac90 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
1aca0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1acb0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
1acc0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1acd0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1ace0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1acf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ad00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1ad10 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1ad20 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1ad30 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1ad40 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1ad50 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1ad60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ad70 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ad80 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ad90 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1ada0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1adb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1adc0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1add0 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1ade0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1adf0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1ae00 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1ae10 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
1ae20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
1ae30 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
1ae40 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
1ae50 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
1ae60 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
1ae70 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
1ae80 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
1ae90 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
1aea0 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
1aeb0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
1aec0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
1aed0 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
1aee0 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
1aef0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
1af00 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
1af10 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
1af20 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
1af30 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
1af40 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
1af50 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
1af60 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
1af70 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
1af80 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
1af90 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
1afa0 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
1afb0 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
1afc0 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
1afd0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1afe0 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
1aff0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
1b000 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
1b010 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
1b020 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
1b030 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
1b040 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
1b050 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1b060 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1b070 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1b080 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1b090 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1b0a0 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
1b0b0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
1b0c0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
1b0d0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
1b0e0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
1b0f0 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
1b100 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
1b110 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
1b120 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
1b130 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
1b140 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
1b150 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
1b160 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1b170 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
1b180 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
1b190 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
1b1a0 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
1b1b0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
1b1c0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
1b1d0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
1b1e0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
1b1f0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
1b200 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
1b210 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
1b220 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
1b230 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
1b240 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
1b250 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
1b260 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1b270 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
1b280 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
1b290 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
1b2a0 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
1b2b0 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
1b2c0 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
1b2d0 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
1b2e0 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
1b2f0 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
1b300 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1b310 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
1b320 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
1b330 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
1b340 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72  r *p;.  if( pBtr
1b350 65 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ee==0 ) return;.
1b360 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b370 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
1b380 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
1b390 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1b3a0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1b3b0 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
1b3c0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1b3d0 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74  r(p);.    p->eSt
1b3e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
1b3f0 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e  LT;.    p->skipN
1b400 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
1b410 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
1b420 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1b430 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1b440 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
1b450 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
1b460 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
1b470 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1b480 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d  Leave(pBtree);.}
1b490 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1b4a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b4b0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41   in progress.  A
1b4c0 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
1b4d0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20  be.** invalided 
1b4e0 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
1b4f0 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  n.  Any attempt 
1b500 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a  to use a cursor.
1b510 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  ** that was open
1b520 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
1b530 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
1b540 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
1b550 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ** in an error..
1b560 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1b570 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1b580 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1b590 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1b5a0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1b5b0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1b5c0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1b5d0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1b5e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b5f0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
1b600 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
1b610 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ode){.  int rc;.
1b620 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b630 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
1b640 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
1b650 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b660 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70  r(p);.  if( trip
1b670 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
1b680 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70  ){.    rc = trip
1b690 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75  Code = saveAllCu
1b6a0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1b6b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1b6c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b6d0 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
1b6e0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1b6f0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1b700 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 29  ors(p, tripCode)
1b710 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74  ;.  }.  btreeInt
1b720 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66  egrity(p);..  if
1b730 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1b740 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1b750 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61   int rc2;..    a
1b760 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
1b770 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
1b780 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
1b790 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
1b7a0 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
1b7b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1b7c0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
1b7d0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
1b7e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1b7f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1b800 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
1b810 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
1b820 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
1b830 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74  ** call btreeGet
1b840 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
1b850 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
1b860 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
1b870 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
1b880 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
1b890 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61    if( btreeGetPa
1b8a0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
1b8b0 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
1b8c0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
1b8d0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1b8e0 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
1b8f0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65  aData);.      te
1b900 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
1b910 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50   );.      if( nP
1b920 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  age==0 ) sqlite3
1b930 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1b940 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
1b950 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ge);.      testc
1b960 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
1b970 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =nPage );.      
1b980 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
1b990 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  ge;.      releas
1b9a0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
1b9b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1b9c0 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
1b9d0 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
1b9e0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1b9f0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1ba00 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
1ba10 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1ba20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1ba30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1ba40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ba50 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
1ba60 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
1ba70 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
1ba80 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20  tion can can be 
1ba90 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
1baa0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
1bab0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
1bac0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
1bad0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
1bae0 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
1baf0 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
1bb00 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1bb10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
1bb20 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
1bb30 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
1bb40 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
1bb50 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
1bb60 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
1bb70 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
1bb80 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
1bb90 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
1bba0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
1bbb0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
1bbc0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
1bbd0 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
1bbe0 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
1bbf0 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
1bc00 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1bc10 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
1bc20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
1bc30 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
1bc40 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
1bc50 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
1bc60 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
1bc70 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1bc80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
1bc90 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
1bca0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
1bcb0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
1bcc0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1bcd0 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
1bce0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1bcf0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1bd00 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1bd10 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
1bd20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
1bd30 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
1bd40 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
1bd50 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
1bd60 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
1bd70 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
1bd80 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
1bd90 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
1bda0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
1bdb0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
1bdc0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
1bdd0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
1bde0 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
1bdf0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
1be00 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
1be10 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
1be20 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
1be30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1be40 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
1be50 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
1be60 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
1be70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1be80 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
1be90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
1beb0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1bec0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
1bed0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1bee0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1bef0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1bf00 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
1bf10 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
1bf20 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
1bf30 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
1bf40 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1bf50 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1bf60 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
1bf70 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
1bf80 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1bf90 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
1bfa0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
1bfb0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
1bfc0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
1bfd0 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
1bfe0 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
1bff0 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
1c000 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
1c010 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
1c020 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
1c030 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
1c040 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
1c050 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
1c060 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1c070 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
1c080 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1c090 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1c0a0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1c0b0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
1c0c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1c0d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1c0e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
1c0f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1c100 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1c110 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
1c120 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1c130 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
1c140 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
1c150 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
1c160 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
1c170 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
1c180 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
1c190 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
1c1a0 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
1c1b0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
1c1c0 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
1c1d0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1c1e0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
1c1f0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1c200 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
1c210 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
1c220 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1c230 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
1c240 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
1c250 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
1c260 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
1c270 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
1c280 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
1c290 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
1c2a0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
1c2b0 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
1c2c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
1c2d0 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
1c2e0 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
1c2f0 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
1c300 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
1c310 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
1c320 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
1c330 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1c340 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
1c350 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
1c360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1c370 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
1c380 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1c390 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1c3a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1c3b0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
1c3c0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
1c3d0 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
1c3e0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
1c3f0 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
1c400 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
1c410 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
1c420 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1c430 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
1c440 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1c450 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c460 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
1c470 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
1c480 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
1c490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c4a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1c4b0 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
1c4c0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1c4d0 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
1c4e0 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
1c4f0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1c500 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c510 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
1c520 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
1c530 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
1c540 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
1c550 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1c560 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
1c570 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1c580 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1c590 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
1c5a0 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
1c5b0 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
1c5c0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
1c5d0 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
1c5e0 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
1c5f0 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
1c600 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
1c610 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
1c620 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
1c630 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1c640 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1c650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c660 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1c670 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
1c680 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
1c690 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
1c6a0 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
1c6b0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1c6c0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1c6d0 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1c6e0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
1c6f0 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
1c700 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
1c710 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
1c720 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
1c730 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
1c740 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
1c750 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1c760 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
1c770 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
1c780 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
1c790 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1c7a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
1c7b0 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
1c7c0 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
1c7d0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1c7e0 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
1c7f0 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
1c800 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
1c810 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
1c820 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
1c830 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
1c840 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
1c850 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
1c860 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
1c870 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
1c880 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
1c890 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
1c8a0 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
1c8b0 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
1c8c0 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
1c8d0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
1c8e0 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
1c8f0 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
1c900 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1c910 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
1c920 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
1c930 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
1c940 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
1c950 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
1c960 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
1c970 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
1c980 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
1c990 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
1c9a0 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
1c9b0 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
1c9c0 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
1c9d0 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
1c9e0 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
1c9f0 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
1ca00 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
1ca10 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
1ca20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1ca30 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
1ca40 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
1ca50 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
1ca60 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
1ca70 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
1ca80 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
1ca90 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
1caa0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
1cab0 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
1cac0 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
1cad0 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
1cae0 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
1caf0 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
1cb00 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
1cb10 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1cb20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
1cb30 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
1cb40 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
1cb50 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1cb60 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
1cb70 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
1cb80 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
1cb90 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
1cba0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
1cbb0 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
1cbc0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
1cbd0 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
1cbe0 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
1cbf0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cc20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
1cc30 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1cc60 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1cc70 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1cca0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
1ccb0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
1ccc0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
1ccd0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1cce0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
1ccf0 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
1cd00 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
1cd10 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
1cd40 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
1cd50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1cd60 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
1cd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1cd80 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
1cd90 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1cda0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1cdb0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
1cdc0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1cdd0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
1cde0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1cdf0 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
1ce00 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
1ce10 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
1ce20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
1ce30 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
1ce40 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
1ce50 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
1ce60 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
1ce70 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
1ce80 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
1ce90 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
1cea0 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
1ceb0 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
1cec0 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
1ced0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
1cee0 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1cef0 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
1cf00 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72   pKeyInfo!=0, wr
1cf10 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73  Flag+1) );.  ass
1cf20 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1cf30 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
1cf40 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
1cf50 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
1cf60 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1cf70 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
1cf80 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
1cf90 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
1cfa0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1cfb0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
1cfc0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1cfd0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1cfe0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1cff0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
1d000 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
1d010 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66  ->aData );..  if
1d020 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26  ( NEVER(wrFlag &
1d030 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
1d040 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1d050 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74  )!=0) ){.    ret
1d060 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
1d070 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  NLY;.  }.  if( i
1d080 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
1d090 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
1d0a0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1d0b0 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
1d0c0 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
1d0d0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
1d0e0 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
1d0f0 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
1d100 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
1d110 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
1d120 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
1d130 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
1d140 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
1d150 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
1d160 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
1d170 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
1d180 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
1d190 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
1d1a0 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1d1b0 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
1d1c0 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
1d1d0 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c  Bt;.  pCur->wrFl
1d1e0 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b  ag = (u8)wrFlag;
1d1f0 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
1d200 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
1d210 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1d220 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
1d230 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1d240 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
1d250 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
1d260 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1d270 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1d280 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1d290 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  id = 0;.  return
1d2a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
1d2b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1d2c0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1d2d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2f0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
1d300 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1d310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1d340 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1d350 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d380 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
1d390 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
1d3a0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
1d3b0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d3d0 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
1d3e0 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
1d3f0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1d420 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
1d430 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1d440 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1d450 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1d460 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
1d470 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
1d480 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
1d490 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1d4a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1d4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1d4c0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1d4d0 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
1d4e0 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
1d4f0 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
1d500 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
1d510 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
1d520 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
1d530 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
1d540 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
1d550 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
1d560 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
1d570 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
1d580 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
1d590 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
1d5a0 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
1d5b0 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
1d5c0 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
1d5d0 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
1d5e0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
1d5f0 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
1d600 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
1d610 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
1d620 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1d630 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
1d640 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
1d650 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
1d660 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
1d670 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
1d680 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
1d690 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
1d6a0 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
1d6b0 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
1d6c0 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
1d6d0 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
1d6e0 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
1d6f0 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
1d700 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
1d710 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
1d720 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
1d730 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
1d740 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
1d750 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1d760 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
1d770 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
1d780 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d790 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
1d7a0 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
1d7b0 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
1d7c0 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d  rsor, iPage));.}
1d7d0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1d7e0 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c  cached rowid val
1d7f0 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73  ue of every curs
1d800 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  or in the same d
1d810 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1d820 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69  as pCur and havi
1d830 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ng the same root
1d840 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20   page number as 
1d850 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65  pCur.  The value
1d860 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52   is.** set to iR
1d870 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  owid..**.** Only
1d880 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20   positive rowid 
1d890 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1d8a0 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20  dered valid for 
1d8b0 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54  this cache..** T
1d8c0 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74  he cache is init
1d8d0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c  ialized to zero,
1d8e0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
1d8f0 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a  nvalid cache..**
1d900 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f   A btree will wo
1d910 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72  rk fine with zer
1d920 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
1d930 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63  wids.  We just c
1d940 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a  annot.** cache z
1d950 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20  ero or negative 
1d960 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65  rowids, which me
1d970 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20  ans tables that 
1d980 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e  use zero or.** n
1d990 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d  egative rowids m
1d9a0 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
1d9b0 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69  e slower.  But i
1d9c0 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f  n practice, zero
1d9d0 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20  .** or negative 
1d9e0 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20  rowids are very 
1d9f0 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73  uncommon so this
1da00 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
1da10 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
1da20 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  d sqlite3BtreeSe
1da30 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
1da40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c  ursor *pCur, sql
1da50 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
1da60 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  d){.  BtCursor *
1da70 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d  p;.  for(p=pCur-
1da80 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1da90 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1daa0 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
1dab0 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ot==pCur->pgnoRo
1dac0 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f  ot ) p->cachedRo
1dad0 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
1dae0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1daf0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69  ->cachedRowid==i
1db00 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rowid );.}../*.*
1db10 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63  * Return the cac
1db20 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68  hed rowid for th
1db30 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20  e given cursor. 
1db40 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a   A negative or z
1db50 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  ero.** return va
1db60 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  lue indicates th
1db70 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  at the rowid cac
1db80 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e  he is invalid an
1db90 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  d should be.** i
1dba0 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20  gnored.  If the 
1dbb0 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20  rowid cache has 
1dbc0 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1dbd0 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a  n set, then a.**
1dbe0 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
1dbf0 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  d..*/.sqlite3_in
1dc00 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  t64 sqlite3Btree
1dc10 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42  GetCachedRowid(B
1dc20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1dc30 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63    return pCur->c
1dc40 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  achedRowid;.}../
1dc50 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
1dc60 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
1dc70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1dc80 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
1dc90 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
1dca0 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
1dcb0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
1dcc0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
1dcd0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
1dce0 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
1dcf0 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
1dd00 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
1dd10 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
1dd20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
1dd30 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1dd40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1dd50 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1dd60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1dd70 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1dd80 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r);.    if( pCur
1dd90 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
1dda0 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
1ddb0 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
1ddc0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
1ddd0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
1dde0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1ddf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
1de00 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1de10 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
1de20 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50  pPrev = pCur->pP
1de30 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  rev;.    }.    f
1de40 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
1de50 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1de60 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1de70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
1de80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
1de90 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1dea0 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69  pBt);.    invali
1deb0 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1dec0 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20  e(pCur);.    /* 
1ded0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
1dee0 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
1def0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1df00 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
1df10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1df20 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1df30 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
1df40 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
1df50 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
1df60 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1df70 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
1df80 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1df90 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
1dfa0 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
1dfb0 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
1dfc0 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
1dfd0 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
1dfe0 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
1dff0 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
1e000 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
1e010 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
1e020 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
1e030 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
1e040 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a  eParseCell()..**
1e050 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20  .** 2007-06-25: 
1e060 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20   There is a bug 
1e070 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  in some versions
1e080 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61   of MSVC that ca
1e090 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  use the.** compi
1e0a0 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65  ler to crash whe
1e0b0 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20  n getCellInfo() 
1e0c0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1e0d0 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75  s a macro..** Bu
1e0e0 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61  t there is a mea
1e0f0 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61  sureable speed a
1e100 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
1e110 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67  g the macro on g
1e120 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73  cc.** (when less
1e130 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
1e140 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73  zations like -Os
1e150 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64   or -O0 are used
1e160 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70   and the.** comp
1e170 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e  iler is not doin
1e180 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69  g agressive inli
1e190 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73  ning.)  So we us
1e1a0 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
1e1b0 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e  n.** for MSVC an
1e1c0 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76  d a macro for ev
1e1d0 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20  erything else.  
1e1e0 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f  Ticket #2457..*/
1e1f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1e200 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
1e210 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
1e220 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1e230 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1e240 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1e250 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1e260 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
1e270 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
1e280 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
1e290 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1e2a0 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
1e2b0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
1e2c0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
1e2d0 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  ( memcmp(&info, 
1e2e0 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
1e2f0 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
1e300 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
1e310 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
1e320 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
1e330 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
1e340 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
1e350 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
1e360 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
1e370 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
1e380 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
1e390 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
1e3a0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1e3b0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1e3c0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1e3d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
1e3e0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1e3f0 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
1e400 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1e410 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1e420 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1e430 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1e440 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1e450 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1e460 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1e470 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1e480 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1e490 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1e4a0 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1e4b0 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1e4c0 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1e4d0 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1e4e0 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1e4f0 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1e500 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e540 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1e550 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1e590 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1e5a0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1e5e0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1e5f0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1e600 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1e610 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1e620 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70  ->info); \.    p
1e630 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1e640 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
1e680 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1e6d0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1e6e0 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e710 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e720 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
1e730 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _VER */..#ifndef
1e740 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
1e750 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
1e760 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1e770 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1e780 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
1e790 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
1e7a0 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
1e7b0 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
1e7c0 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
1e7d0 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
1e7e0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
1e7f0 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
1e800 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
1e810 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
1e820 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
1e830 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
1e840 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1e850 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
1e860 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1e870 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
1e880 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1e890 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
1e8a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e8b0 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
1e8c0 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
1e8d0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1e8e0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1e8f0 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
1e900 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
1e910 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
1e920 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1e930 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
1e940 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1e950 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
1e960 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
1e970 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
1e980 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
1e990 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
1e9a0 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
1e9b0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1e9c0 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
1e9d0 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
1e9e0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1e9f0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1ea00 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
1ea10 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
1ea20 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
1ea30 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1ea40 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
1ea50 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1ea60 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
1ea70 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1ea80 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
1ea90 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
1eaa0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
1eab0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
1eac0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ead0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1eae0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1eaf0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1eb00 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
1eb10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1eb20 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
1eb30 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1eb40 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
1eb50 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pSize = 0;.  }el
1eb60 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49  se{.    getCellI
1eb70 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a  nfo(pCur);.    *
1eb80 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1eb90 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  fo.nKey;.  }.  r
1eba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ebb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1ebc0 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1ebd0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1ebe0 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1ebf0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1ec00 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1ec10 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
1ec20 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
1ec30 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
1ec40 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1ec50 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
1ec60 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
1ec70 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1ec80 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1ec90 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
1eca0 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
1ecb0 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
1ecc0 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
1ecd0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
1ece0 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1ecf0 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
1ed00 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
1ed10 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1ed20 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
1ed30 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
1ed40 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
1ed50 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
1ed60 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
1ed70 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1ed80 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
1ed90 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
1eda0 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
1edb0 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1edc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1edd0 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1ede0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1edf0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ee00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ee10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ee20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
1ee30 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1ee40 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1ee50 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65  info.nData;.  re
1ee60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ee70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1ee80 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1ee90 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
1eea0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1eeb0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
1eec0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
1eed0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
1eee0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1eef0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1ef00 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
1ef10 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
1ef20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
1ef30 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
1ef40 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
1ef50 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
1ef60 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
1ef70 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
1ef80 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
1ef90 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
1efa0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1efb0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1efc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1efd0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
1efe0 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
1eff0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
1f000 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1f010 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1f020 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
1f030 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
1f040 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
1f050 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
1f060 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
1f070 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
1f080 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
1f090 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
1f0a0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
1f0b0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1f0c0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
1f0d0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
1f0e0 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
1f0f0 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
1f100 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
1f110 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
1f120 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
1f130 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
1f140 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1f150 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1f160 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
1f170 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
1f180 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
1f190 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
1f1a0 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
1f1b0 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
1f1c0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
1f1d0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
1f1e0 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
1f1f0 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
1f200 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
1f210 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
1f220 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1f230 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1f240 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1f250 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f260 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f270 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1f280 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
1f290 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1f2a0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1f2b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
1f2c0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1f2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1f2e0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
1f2f0 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
1f300 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
1f310 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
1f320 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
1f330 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
1f340 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
1f350 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
1f360 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
1f370 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f380 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1f390 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f3a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1f3b0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
1f3c0 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
1f3d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f3e0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
1f3f0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
1f400 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1f410 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
1f420 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
1f430 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
1f440 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
1f450 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
1f460 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
1f470 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
1f480 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
1f490 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
1f4a0 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
1f4b0 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
1f4c0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
1f4d0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
1f4e0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
1f4f0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
1f500 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
1f510 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
1f520 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1f530 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1f540 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
1f550 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
1f560 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
1f570 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
1f580 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1f590 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
1f5a0 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
1f5b0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1f5c0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
1f5d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
1f5e0 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
1f5f0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
1f600 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1f610 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
1f620 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
1f630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f640 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
1f650 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1f660 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
1f670 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
1f680 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
1f690 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1f6a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f6b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1f6c0 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
1f6d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1f6e0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1f6f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1f700 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1f710 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
1f720 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ge, 0);.    asse
1f730 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1f740 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b  K || pPage==0 );
1f750 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f770 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
1f780 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
1f790 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
1f7a0 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
1f7b0 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
1f7c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
1f7d0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
1f7e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1f7f0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1f800 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
1f810 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
1f820 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
1f830 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
1f840 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
1f850 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
1f860 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
1f870 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
1f880 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
1f890 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
1f8a0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1f8b0 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
1f8c0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
1f8d0 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
1f8e0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1f8f0 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
1f900 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
1f910 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
1f920 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
1f930 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
1f940 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f950 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1f960 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
1f970 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
1f980 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
1f990 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1f9a0 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
1f9b0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1f9c0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1f9d0 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
1f9e0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
1f9f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1fa00 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
1fa10 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
1fa20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1fa30 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
1fa40 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa60 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
1fa70 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
1fa80 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1fa90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1faa0 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
1fab0 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fad0 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
1fae0 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
1faf0 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
1fb00 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
1fb10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
1fb20 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
1fb30 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
1fb40 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
1fb50 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
1fb60 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
1fb70 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
1fb80 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
1fb90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fba0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1fbb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fbc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1fbd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
1fbe0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
1fbf0 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
1fc00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
1fc10 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
1fc20 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
1fc30 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
1fc40 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
1fc50 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
1fc60 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1fc70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1fc80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1fc90 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
1fca0 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
1fcb0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
1fcc0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
1fcd0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
1fce0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
1fcf0 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
1fd00 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
1fd10 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
1fd20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
1fd30 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
1fd40 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
1fd50 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
1fd60 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
1fd70 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
1fd80 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1fd90 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
1fda0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
1fdb0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
1fdc0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
1fdd0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
1fde0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
1fdf0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
1fe00 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
1fe10 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
1fe20 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
1fe30 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
1fe40 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
1fe50 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
1fe60 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
1fe70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
1fe80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
1fe90 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
1fea0 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1feb0 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
1fec0 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
1fed0 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
1fee0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
1fef0 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
1ff00 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
1ff10 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
1ff20 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
1ff30 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1ff40 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
1ff50 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
1ff60 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
1ff70 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
1ff80 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
1ff90 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
1ffa0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
1ffb0 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
1ffc0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
1ffd0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1ffe0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1fff0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
20000 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
20010 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
20020 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
20030 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
20040 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
20050 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
20060 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
20070 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
20080 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
20090 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
200a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
200b0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
200c0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
200d0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
200e0 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
200f0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
20100 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
20110 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
20120 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
20130 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
20140 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
20150 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
20160 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
20170 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
20180 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
20190 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
201a0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
201b0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
201c0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
201d0 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
201e0 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
201f0 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
20200 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
20210 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
20220 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
20230 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
20240 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20250 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
20260 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
20270 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
20280 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
20290 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
202a0 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
202b0 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
202c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
202d0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
202e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
202f0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
20300 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
20310 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
20320 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20330 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72  ->iPage]; /* Btr
20340 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
20350 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
20360 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
20370 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
20380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
20390 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
203a0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
203b0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
203c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
203d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
203e0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
203f0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20400 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
20410 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
20420 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20430 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20440 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
20450 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
20460 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
20470 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
20480 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79  .nHeader;.  nKey
20490 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65   = (pPage->intKe
204a0 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75  y ? 0 : (int)pCu
204b0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a  r->info.nKey);..
204c0 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73    if( NEVER(offs
204d0 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
204e0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20  ur->info.nData) 
204f0 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64  .   || &aPayload
20500 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
20510 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44  al] > &pPage->aD
20520 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
20530 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ize].  ){.    /*
20540 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
20550 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
20560 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
20570 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
20580 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20590 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
205a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
205b0 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
205c0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
205d0 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
205e0 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
205f0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
20600 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
20610 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
20620 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
20630 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
20640 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
20650 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
20660 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
20670 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
20680 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
20690 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
206a0 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65  f, a, eOp, pPage
206b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
206c0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
206d0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
206e0 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
206f0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
20700 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20710 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  l;.  }..  if( rc
20720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
20730 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
20740 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
20750 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
20760 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
20770 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
20780 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
20790 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
207a0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
207b0 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
207c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
207d0 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ]);..#ifndef SQL
207e0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
207f0 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
20800 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
20810 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
20820 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
20830 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a  verflow[].    **
20840 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
20850 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
20860 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72  e it now. The ar
20870 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a  ray is sized at.
20880 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79      ** one entry
20890 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
208a0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  ow page in the o
208b0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
208c0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e  he.    ** page n
208d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
208e0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
208f0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   is stored in aO
20900 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20  verflow[0],.    
20910 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ** etc. A value 
20920 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
20930 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65  rflow[] array me
20940 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
20950 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20  wn".    ** (the 
20960 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
20970 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
20980 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
20990 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
209a0 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  e && !pCur->aOve
209b0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69  rflow ){.      i
209c0 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
209d0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
209e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
209f0 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
20a00 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43  flSize;.      pC
20a10 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
20a20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d  (Pgno *)sqlite3M
20a30 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
20a40 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20  (Pgno)*nOvfl);. 
20a50 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73       /* nOvfl is
20a60 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
20a70 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a 65  .  If it were ze
20a80 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64  ro, fetchPayload
20a90 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20   would have.    
20aa0 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69    ** been used i
20ab0 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20 72  nstead of this r
20ac0 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20  outine. */.     
20ad0 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66   if( ALWAYS(nOvf
20ae0 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  l) && !pCur->aOv
20af0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
20b00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
20b10 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
20b20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
20b30 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
20b40 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
20b50 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
20b60 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
20b70 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
20b80 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
20b90 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
20ba0 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
20bb0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
20bc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
20bd0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
20be0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
20bf0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
20c00 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
20c10 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
20c20 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
20c30 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
20c40 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
20c50 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
20c60 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
20c70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
20c80 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
20c90 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
20ca0 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
20cb0 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  +){..#ifndef SQL
20cc0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
20cd0 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  B.      /* If re
20ce0 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
20cf0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
20d00 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
20d10 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
20d20 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
20d30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
20d40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20d50 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
20d60 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
20d70 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
20d80 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
20d90 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
20da0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ge;.      }.#end
20db0 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  if..      if( of
20dc0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
20dd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
20de0 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
20df0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
20e00 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
20e10 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
20e20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
20e30 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
20e40 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
20e50 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
20e60 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
20e70 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
20e80 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
20e90 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
20ea0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
20eb0 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
20ec0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
20ed0 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
20ee0 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
20ef0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
20f00 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65         */.#ifnde
20f10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
20f20 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69  CRBLOB.        i
20f30 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
20f40 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
20f50 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
20f60 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
20f70 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
20f80 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
20f90 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23         } else .#
20fa0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
20fb0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
20fc0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
20fd0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
20fe0 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
20ff0 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
21000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21010 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
21020 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
21030 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
21040 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
21050 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
21060 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
21070 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
21080 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
21090 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
210a0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
210b0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
210c0 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
210d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
210e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
210f0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
21100 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
21110 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
21120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
21130 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
21140 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
21150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
21160 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
21170 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
21180 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
21190 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
211a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
211b0 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
211c0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
211d0 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
211e0 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
211f0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
21200 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
21210 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
21220 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
21230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
21240 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
21250 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
21260 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  ) there is no op
21270 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  en write-transac
21280 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20  tion, and.      
21290 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61    **   5) the da
212a0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20  tabase is not a 
212b0 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20  WAL database,.  
212c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
212d0 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
212e0 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
212f0 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
21300 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
21310 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
21320 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
21330 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
21340 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
21350 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
21360 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
21370 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
21380 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
21390 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
213a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
213b0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20      if( eOp==0  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
213f0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
21400 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
21440 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
21450 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
21460 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21480 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
21490 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
214a0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
214b0 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
214c0 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
214d0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
214e0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
214f0 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21510 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
21520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
21530 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
21540 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
21550 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
21560 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53         memcpy(aS
21570 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b  ave, aWrite, 4);
21580 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21590 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
215a0 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28  , aWrite, a+4, (
215b0 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  i64)pBt->pageSiz
215c0 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  e*(nextPage-1));
215d0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
215e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
215f0 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
21600 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
21610 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
21620 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
21630 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
21640 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
21650 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
21660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21670 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
21680 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
21690 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
216a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
216b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
216c0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
216d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
216e0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
216f0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
21700 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
21710 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
21720 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
21730 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
21740 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
21750 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
21760 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21770 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
21780 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21790 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
217a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
217b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
217c0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
217d0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
217e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
217f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21800 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
21810 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21820 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21830 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21840 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
21850 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
21860 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
21870 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
21880 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
21890 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
218a0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
218b0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
218c0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
218d0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
218e0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
218f0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
21900 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
21910 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
21920 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
21930 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21940 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
21950 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
21960 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
21970 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
21980 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
21990 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
219a0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
219b0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
219c0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
219d0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
219e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
219f0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
21a00 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
21a10 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21a20 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21a30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21a40 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21a50 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
21a60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
21a70 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
21a80 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21a90 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
21aa0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21ab0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
21ac0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21ad0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
21ae0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
21af0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
21b00 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
21b10 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
21b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
21b30 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
21b40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
21b50 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
21b60 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
21b70 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
21b80 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
21b90 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
21ba0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
21bb0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
21bc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
21bd0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
21be0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
21bf0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
21c00 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
21c10 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
21c20 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
21c30 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
21c40 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
21c50 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
21c60 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
21c70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
21c80 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
21c90 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
21ca0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
21cb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21cc0 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
21cd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21ce0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
21cf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21d00 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
21d10 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
21d20 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21d30 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
21d40 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
21d50 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
21d60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21d70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21d80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21d90 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21da0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21db0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
21dc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21dd0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
21de0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
21df0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
21e00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21e10 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
21e20 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
21e30 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
21e40 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
21e50 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
21e60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21e70 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21e80 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
21e90 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
21ea0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
21eb0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
21ec0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
21ed0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
21ee0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
21ef0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
21f00 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
21f10 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
21f20 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
21f30 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
21f40 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
21f50 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
21f60 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
21f70 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
21f80 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
21f90 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
21fa0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
21fb0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
21fc0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
21fd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21fe0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
21ff0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
22000 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
22010 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
22020 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
22030 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
22040 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
22050 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
22060 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
22070 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
22080 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
22090 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
220a0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
220b0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
220c0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
220d0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
220e0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
220f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
22100 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
22110 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
22120 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
22130 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
22140 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
22150 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
22160 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
22170 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
22180 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
22190 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
221a0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
221b0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
221c0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
221d0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
221e0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
221f0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
22200 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
22210 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
22220 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
22230 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
22240 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
22250 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
22260 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
22270 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
22280 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
22290 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
222a0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
222b0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
222c0 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
222d0 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
222e0 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
222f0 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
22300 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
22310 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
22320 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
22330 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
22340 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75  .  u32 nKey;.  u
22350 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  32 nLocal;..  as
22360 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
22370 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
22380 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
22390 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
223a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
223b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
223c0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
223d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
223e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61  x(pCur) );.  pPa
223f0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
22400 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
22410 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22420 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22430 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
22440 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
22450 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
22460 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65  =0) ){.    btree
22470 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
22480 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22490 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
224a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20  [pCur->iPage],. 
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a    &pCur->info);.
224d0 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d    }.  aPayload =
224e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
224f0 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
22500 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
22510 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
22520 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
22530 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
22540 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69  e{.    nKey = (i
22550 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
22560 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
22570 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
22580 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
22590 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
225a0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
225b0 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
225c0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
225d0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
225e0 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61     assert( nLoca
225f0 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20  l<=nKey );.  }. 
22600 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
22610 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
22620 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
22630 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
22640 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
22650 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
22660 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
22670 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
22680 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
22690 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
226a0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
226b0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
226c0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
226d0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
226e0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
226f0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
22700 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
22710 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
22720 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
22730 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
22740 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
22750 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
22760 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
22770 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
22780 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
22790 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
227a0 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
227b0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
227c0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
227d0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
227e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
227f0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
22800 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
22810 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
22820 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
22830 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
22840 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
22850 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
22860 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
22870 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
22880 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
22890 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
228a0 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *pAmt){.  const 
228b0 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61  void *p = 0;.  a
228c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
228d0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
228e0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
228f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
22900 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22910 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
22920 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
22930 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22940 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63  D) ){.    p = (c
22950 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
22960 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
22970 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
22980 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20  turn p;.}.const 
22990 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
229a0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
229b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
229c0 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *pAmt){.  const 
229d0 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61  void *p = 0;.  a
229e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
229f0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
22a00 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
22a10 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
22a20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22a30 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
22a40 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
22a50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22a60 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63  D) ){.    p = (c
22a70 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
22a80 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
22a90 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 1);.  }.  re
22aa0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn p;.}.../*.*
22ab0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22ac0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
22ad0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
22ae0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
22af0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
22b00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
22b10 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
22b20 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
22b30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
22b40 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
22b50 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
22b60 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
22b70 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
22b80 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
22b90 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
22ba0 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
22bb0 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
22bc0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
22bd0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
22be0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
22bf0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
22c00 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
22c10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
22c20 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
22c30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
22c40 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
22c50 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
22c60 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
22c70 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
22c80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
22c90 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
22ca0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22cb0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22cd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22ce0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
22cf0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
22d00 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
22d10 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75  PTH );.  if( pCu
22d20 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
22d30 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
22d40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
22d50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22d60 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
22d70 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
22d80 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
22d90 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  wPage);.  if( rc
22da0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
22db0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
22dc0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
22dd0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
22de0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
22df0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
22e00 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
22e10 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
22e20 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
22e30 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  wPage->nCell<1 |
22e40 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b  | pNewPage->intK
22e50 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ey!=pCur->apPage
22e60 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [i]->intKey ){. 
22e70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22e80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22e90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22ea0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a  TE_OK;.}..#if 0.
22eb0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
22ec0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
22ed0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
22ee0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
22ef0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
22f00 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
22f10 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
22f20 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
22f30 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
22f40 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
22f50 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
22f60 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
22f70 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
22f80 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
22f90 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
22fa0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
22fb0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
22fc0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
22fd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
22fe0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
22ff0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
23000 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
23010 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
23020 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
23030 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
23040 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
23050 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
23060 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
23070 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
23080 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
23090 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
230a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
230b0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
230c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
230d0 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
230e0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
230f0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
23100 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
23110 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
23120 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23130 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
23140 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
23150 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
23160 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
23170 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
23180 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
23190 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
231a0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
231b0 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
231c0 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
231d0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
231e0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
231f0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
23200 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
23210 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
23220 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
23230 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
23240 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23250 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
23260 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23270 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23280 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23290 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
232a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
232b0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
232c0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
232d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
232e0 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74  .  /* UPDATE: It
232f0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
23300 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f  sible for the co
23310 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62  ndition tested b
23320 79 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a  y the assert.  *
23330 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e  * below to be un
23340 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
23350 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
23360 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f  rupt. This can o
23370 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65  ccur if.  ** one
23380 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69   cursor has modi
23390 66 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e  fied page pParen
233a0 74 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65  t while a refere
233b0 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c  nce to it is hel
233c0 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63  d .  ** by a sec
233d0 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63  ond cursor. Whic
233e0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
233f0 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  n if a single pa
23400 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a  ge is linked.  *
23410 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  * into more than
23420 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
23430 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75  cture in a corru
23440 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  pt database.  */
23450 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50  .#if 0.  assertP
23460 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
23470 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23480 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
23490 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
234a0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
234b0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
234c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
234d0 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20  no.  );.#endif. 
234e0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
234f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23500 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
23510 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23520 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  -1]->nCell );.. 
23530 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
23540 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23550 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
23560 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
23570 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
23580 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
23590 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
235a0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
235b0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
235c0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
235d0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
235e0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
235f0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
23600 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
23610 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
23620 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
23630 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
23640 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
23650 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
23660 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
23670 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
23680 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
23690 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
236a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
236b0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
236c0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
236d0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
236e0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
236f0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
23700 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
23710 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
23720 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
23730 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
23740 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
23750 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
23760 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
23770 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
23780 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
23790 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
237a0 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
237b0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
237c0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
237d0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
237e0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
237f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
23800 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
23810 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
23820 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
23830 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
23840 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
23850 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
23860 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
23870 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
23880 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
23890 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
238a0 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
238b0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
238c0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
238d0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
238e0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
238f0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
23900 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
23910 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
23920 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
23930 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
23940 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
23950 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
23960 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
23970 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
23980 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
23990 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
239a0 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
239b0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
239c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
239d0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
239e0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
239f0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
23a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23a10 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
23a20 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
23a30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23a40 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
23a50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23a60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23a70 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
23a80 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
23a90 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
23aa0 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
23ab0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
23ac0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
23ad0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
23ae0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
23af0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
23b00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
23b10 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
23b20 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
23b30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23b40 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
23b50 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23b60 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
23b70 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
23b80 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
23b90 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
23ba0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
23bb0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
23bc0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
23bd0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
23be0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
23bf0 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
23c00 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
23c10 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
23c20 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
23c30 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
23c40 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ge = 0;.  }else 
23c50 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
23c60 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
23c70 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
23c80 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
23c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23ca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
23cb0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
23cc0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
23cd0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
23ce0 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69  pPage[0]);.    i
23cf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23d00 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
23d10 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
23d20 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
23d30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23d40 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
23d50 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
23d60 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
23d70 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
23d80 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
23d90 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
23da0 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63  sor.    ** expec
23db0 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
23dc0 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
23dd0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
23de0 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20   pKeyInfo is.   
23df0 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
23e00 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
23e10 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
23e20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
23e30 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74  case,.    ** ret
23e40 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
23e50 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f  RRUPT error.  */
23e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
23e70 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
23e80 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d  tKey==1 || pCur-
23e90 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
23ea0 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ey==0 );.    if(
23eb0 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
23ec0 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61  ==0)!=pCur->apPa
23ed0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
23ee0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23ef0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23f00 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
23f10 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
23f20 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
23f30 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  of the correct t
23f40 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62  ype. This must b
23f50 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20  e the.  ** case 
23f60 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74  as the call to t
23f70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  his function tha
23f80 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f  t loaded the roo
23f90 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a 20  t-page (either. 
23fa0 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72   ** this call or
23fb0 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f   a previous invo
23fc0 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61  cation) would ha
23fd0 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
23fe0 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20  uption .  ** if 
23ff0 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77  the assumption w
24000 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
24010 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
24020 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61  ible for the fla
24030 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f  gs .  ** byte to
24040 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
24050 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 63  ied while this c
24060 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67  ursor is holding
24070 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a   a reference.  *
24080 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20  * to the page.  
24090 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  */.  pRoot = pCu
240a0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
240b0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
240c0 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
240d0 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oot );.  assert(
240e0 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26   pRoot->isInit &
240f0 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  & (pCur->pKeyInf
24100 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)==pRoot->in
24110 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d  tKey );..  pCur-
24120 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
24130 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
24140 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
24150 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
24160 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
24170 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
24180 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
24190 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
241a0 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
241b0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
241c0 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
241d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
241e0 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
241f0 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
24200 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
24210 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
24220 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24230 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
24240 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
24250 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
24260 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
24270 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
24280 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
24290 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
242a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
242b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
242c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
242d0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
242e0 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
242f0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
24300 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
24310 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
24320 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24330 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
24340 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
24350 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
24360 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
24370 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
24380 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
24390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
243a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
243b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
243c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
243d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
243e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
243f0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
24400 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24410 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24420 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24430 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24440 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
24450 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
24460 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
24470 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
24480 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
24490 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
244a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
244b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
244c0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
244d0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
244e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
244f0 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
24500 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24510 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
24520 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24530 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
24540 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
24550 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
24560 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
24570 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
24580 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
24590 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
245a0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
245b0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
245c0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
245d0 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
245e0 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
245f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
24600 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
24610 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
24620 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
24630 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
24640 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
24650 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
24660 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
24670 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
24680 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
24690 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
246a0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
246b0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
246c0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
246d0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
246e0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
246f0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
24700 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
24710 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
24720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24730 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
24740 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
24750 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24760 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24770 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24780 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
24790 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
247a0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
247b0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
247c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
247d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
247e0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
247f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
24800 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
24810 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
24820 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
24830 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
24840 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
24850 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
24860 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
24870 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
24880 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24890 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
248a0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
248b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
248c0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
248d0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
248e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
248f0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
24900 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
24910 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
24920 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
24930 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
24940 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
24950 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
24960 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
24970 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
24980 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
24990 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
249a0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
249b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
249c0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
249d0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
249e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
249f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24a00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24a10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24a20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
24a30 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
24a40 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
24a50 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
24a60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24a80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24a90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
24aa0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24ab0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
24ac0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
24ad0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24ae0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
24af0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
24b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
24b10 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
24b20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24b30 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
24b40 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
24b50 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
24b60 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
24b70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24b80 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
24b90 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
24ba0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
24bb0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
24bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
24bd0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
24be0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
24bf0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
24c00 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
24c10 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
24c20 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
24c30 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
24c40 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
24c50 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
24c60 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
24c70 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
24c80 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
24c90 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24ca0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24cb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24cc0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
24cd0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
24ce0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
24cf0 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
24d00 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
24d10 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
24d20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
24d30 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
24d40 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
24d50 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
24d60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
24d70 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
24d80 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
24d90 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
24da0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
24db0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
24dc0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
24dd0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
24de0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
24df0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
24e00 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
24e10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
24e20 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
24e30 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
24e40 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
24e50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
24e60 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
24e70 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
24e80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24e90 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
24ea0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
24eb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24ec0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
24ed0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
24ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24ef0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
24f00 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
24f10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24f20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
24f30 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
24f40 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
24f50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
24f60 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
24f70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24f80 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
24f90 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
24fa0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
24fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24fc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24fd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
24fe0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24ff0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
25000 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
25010 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
25020 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
25030 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
25040 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25050 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
25060 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
25070 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
25080 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
25090 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
250a0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
250b0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
250c0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
250d0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
250e0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
250f0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
25100 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
25110 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
25120 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
25130 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
25140 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
25150 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
25160 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
25170 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
25180 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
25190 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
251a0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
251b0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
251c0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
251d0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
251e0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
251f0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
25200 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
25210 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
25220 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
25230 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
25240 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
25250 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
25260 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
25270 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
25280 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
25290 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
252a0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
252b0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
252c0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
252d0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
252e0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
252f0 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
25300 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
25310 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
25320 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
25330 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25340 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
25350 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
25360 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
25370 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
25380 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
25390 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
253a0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
253b0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
253c0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
253d0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
253e0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
253f0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
25400 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25410 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
25440 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
25450 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
25460 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
25470 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
25480 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
25490 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
254a0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
254b0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
254c0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
254d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
254e0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
254f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25500 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25510 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
25520 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
25530 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
25540 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
25550 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
25560 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
25570 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
25580 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
25590 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
255a0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
255b0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
255c0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
255d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
255f0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
25600 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
25610 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
25620 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25630 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25640 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25650 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
25660 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
25670 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
25680 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
25690 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
256a0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
256b0 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
256c0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
256d0 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
256e0 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
256f0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
25700 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
25710 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
25720 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
25730 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
25740 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25750 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
25760 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a  Cur->validNKey .
25770 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
25780 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
25790 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
257a0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
257b0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
257c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
257d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
257e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
257f0 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
25800 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
25810 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
25820 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
25830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
25850 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
25860 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
25870 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
25880 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
25890 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
258a0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
258b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
258c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
258d0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
258e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
258f0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
25900 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
25910 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25920 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
25930 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25940 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
25950 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
25960 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25970 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
25980 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
25990 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
259a0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
259b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
259c0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
259d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
259e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
259f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
25a00 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
25a10 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
25a20 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
25a30 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20  lwr, upr, idx;. 
25a40 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
25a50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
25a60 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
25a70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
25a80 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
25a90 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
25aa0 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
25ab0 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
25ac0 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
25ad0 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
25ae0 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
25af0 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
25b00 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
25b10 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
25b20 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
25b30 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
25b40 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
25b50 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
25b60 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
25b70 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
25b80 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
25b90 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
25ba0 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
25bb0 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
25bc0 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
25bd0 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
25be0 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
25bf0 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
25c00 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
25c10 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
25c20 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
25c30 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
25c40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
25c50 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
25c60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
25c70 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
25c80 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
25c90 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
25ca0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
25cb0 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73 52  1;.    if( biasR
25cc0 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
25cd0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25ce0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69  iPage] = (u16)(i
25cf0 64 78 20 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d  dx = upr);.    }
25d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
25d10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25d20 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78  age] = (u16)(idx
25d30 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b   = (upr+lwr)/2);
25d40 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b  .    }.    for(;
25d50 3b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  ;){.      u8 *pC
25d60 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d80 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
25d90 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
25da0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
25db0 72 74 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61  rt( idx==pCur->a
25dc0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25dd0 5d 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ] );.      pCur-
25de0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
25df0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  .      pCell = f
25e00 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
25e10 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
25e20 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
25e30 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
25e40 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  ey ){.        i6
25e50 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
25e60 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
25e70 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
25e80 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
25e90 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
25ea0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
25eb0 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
25ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
25ed0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
25ee0 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
25ef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
25f00 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
25f10 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
25f20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
25f30 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
25f40 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
25f50 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
25f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25f70 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
25f80 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
25f90 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
25fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25fb0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
25fc0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
25fd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
25fe0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
25ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26000 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
26010 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
26020 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
26030 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
26040 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
26050 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
26060 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
26070 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
26080 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
26090 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
260a0 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
260b0 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
260c0 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
260d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
260e0 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
260f0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
26100 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
26110 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
26120 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
26130 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
26140 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
26150 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
26160 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
26170 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
26180 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
26190 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
261a0 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
261b0 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
261c0 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
261d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
261e0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70     int nCell = p
261f0 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
26200 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
26210 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
26220 61 64 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 26  ad.         /* &
26230 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29 3c  & (pCell+nCell)<
26240 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
26250 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
26260 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
26270 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
26280 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
26290 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
262a0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
262b0 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
262c0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
262d0 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
262e0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
262f0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
26300 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
26310 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26320 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
26330 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
26340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
26350 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
26360 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
26370 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
26380 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
26390 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
263a0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
263b0 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
263c0 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
263d0 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
263e0 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
263f0 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
26400 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e    /* && (pCell+n
26410 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67 65 2d 3e  Cell+2)<=pPage->
26420 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20 20 20  aDataEnd */.    
26430 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26440 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
26450 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
26460 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
26470 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
26480 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
26490 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
264a0 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
264b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
264c0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
264d0 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
264e0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
264f0 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
26500 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
26510 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
26520 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
26530 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
26540 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
26550 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
26560 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
26570 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
26580 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
26590 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
265a0 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
265b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
265c0 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
265d0 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
265e0 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
265f0 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
26600 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
26610 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
26620 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
26630 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
26640 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
26650 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20   be called. */. 
26660 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
26670 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
26680 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
26690 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
266a0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
266b0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
266c0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
266d0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  tr(pPage, pCellB
266e0 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
266f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
26700 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
26710 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
26720 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
26730 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
26740 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Cell );.        
26750 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
26760 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
26780 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
26790 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
267a0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
267b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
267c0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
267d0 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
267e0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
267f0 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  llKey, 0);.     
26800 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
26810 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26820 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
26830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
26840 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
26850 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
26860 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
26870 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
26880 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
26890 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
268a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
268b0 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
268c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
268d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
268e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
268f0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
26900 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
26910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
26920 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
26930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26950 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
26960 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26970 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
26980 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
26990 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
269a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
269b0 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
269c0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
269d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
269e0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
269f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26a00 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
26a10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26a20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
26a30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26a40 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d  e] = (u16)(idx =
26a50 20 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20   (lwr+upr)/2);. 
26a60 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
26a70 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
26a80 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
26a90 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
26aa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
26ab0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
26ac0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
26ad0 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
26ae0 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
26af0 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
26b00 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
26b10 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
26b20 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
26b30 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
26b40 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
26b50 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
26b60 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
26b70 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
26b80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
26b90 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
26ba0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26bb0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26bc0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
26bd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
26be0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ell );.      *pR
26bf0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
26c00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26c10 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
26c20 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
26c30 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
26c40 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
26c50 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
26c60 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
26c70 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
26c80 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
26c90 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
26ca0 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
26cb0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26cc0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
26cd0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
26ce0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
26cf0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
26d00 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
26d10 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
26d20 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
26d30 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
26d40 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
26d50 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
26d60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
26d70 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
26d80 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
26d90 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
26da0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
26db0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
26dc0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
26dd0 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
26de0 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
26df0 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
26e00 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
26e10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
26e20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
26e30 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
26e40 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
26e50 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
26e60 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
26e70 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
26e80 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
26e90 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
26ea0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
26eb0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
26ec0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
26ed0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
26ee0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
26ef0 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
26f00 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
26f10 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
26f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
26f30 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
26f40 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
26f50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
26f60 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
26f70 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
26f80 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
26f90 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
26fa0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
26fb0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
26fc0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
26fd0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
26fe0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
26ff0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
27000 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27010 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
27020 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
27030 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
27040 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
27050 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
27060 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
27070 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
27080 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
27090 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
270a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
270b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
270c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
270d0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
270e0 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  0 );.  if( CURSO
270f0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
27100 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
27110 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
27120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27130 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
27140 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
27150 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
27160 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
27170 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
27180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
27190 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
271a0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
271b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
271c0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
271d0 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
271e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
271f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27200 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20  isInit );..  /* 
27210 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
27220 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
27230 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
27240 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
27250 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
27260 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
27270 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
27280 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
27290 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
272a0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
272b0 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
272c0 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
272d0 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
272e0 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
272f0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
27300 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
27310 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
27320 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
27330 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
27340 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
27350 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
27360 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
27370 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
27380 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
27390 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
273a0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
273b0 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ;.  if( idx>=pPa
273c0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
273d0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
273e0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
273f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
27400 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
27410 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
27420 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
27430 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
27440 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27450 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
27460 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
27470 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
27480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
27490 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
274a0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
274b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
274c0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
274d0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
274e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
274f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27510 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
27520 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
27530 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
27540 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27550 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
27560 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27570 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
27580 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
27590 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
275a0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
275b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
275c0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
275d0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
275e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
275f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27600 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
27610 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
27620 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
27630 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
27640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27650 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
27660 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
27670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27680 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
27690 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
276a0 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
276b0 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
276c0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
276d0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
276e0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
276f0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
27700 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
27710 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
27720 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
27730 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
27740 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
27750 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
27760 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
27770 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27780 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
27790 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
277a0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
277b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
277c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
277d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
277e0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
277f0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
27800 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
27810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27820 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
27830 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61    }.  pCur->atLa
27840 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55  st = 0;.  if( CU
27850 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
27860 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
27870 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
27880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27890 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
278a0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
278b0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
278c0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  ext = 0;.    *pR
278d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
278e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
278f0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  }.  pCur->skipNe
27900 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  xt = 0;..  pPage
27910 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27920 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
27930 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
27940 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
27950 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
27960 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
27970 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27980 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
27990 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
279a0 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
279b0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
279c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
279d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
279e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
279f0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
27a00 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
27a10 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
27a20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27a30 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
27a40 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
27a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
27a60 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
27a70 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
27a80 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
27a90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27ab0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
27ac0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
27ad0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66   }.    pCur->inf
27ae0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
27af0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
27b00 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d   = 0;..    pCur-
27b10 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27b20 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
27b30 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27b40 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
27b50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
27b60 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
27b70 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
27b80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
27b90 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
27ba0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
27bb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27bc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
27bd0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
27be0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27bf0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
27c00 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
27c10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
27c20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
27c30 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
27c40 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
27c50 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
27c60 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
27c70 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
27c80 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
27c90 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
27ca0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
27cb0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
27cc0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
27cd0 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
27ce0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
27cf0 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
27d00 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
27d10 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
27d20 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
27d30 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
27d40 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
27d50 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
27d60 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
27d70 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
27d80 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
27d90 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
27da0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
27db0 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
27dc0 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
27dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
27de0 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
27df0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
27e00 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
27e10 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
27e20 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
27e30 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
27e40 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
27e50 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
27e60 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
27e70 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
27e80 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
27e90 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
27ea0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
27eb0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
27ec0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
27ed0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
27ee0 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
27ef0 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
27f00 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
27f10 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
27f20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
27f30 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
27f40 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
27f50 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
27f60 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
27f70 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
27f80 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
27f90 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
27fa0 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
27fb0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
27fc0 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
27fd0 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
27fe0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
27ff0 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
28000 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
28010 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
28020 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
28030 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
28040 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
28050 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
28060 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
28070 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
28080 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
28090 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
280a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
280b0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
280c0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
280d0 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
280e0 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
280f0 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
28100 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
28110 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
28120 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
28130 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
28140 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
28150 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
28160 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
28170 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
28180 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
28190 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
281a0 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
281b0 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
281c0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
281d0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
281e0 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
281f0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
28200 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
28210 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
28220 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
28230 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
28240 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
28250 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
28260 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
28270 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
28280 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
28290 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
282a0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
282b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
282c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
282d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
282e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
282f0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
28300 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
28310 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
28320 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
28330 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
28340 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
28350 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
28360 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
28370 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
28380 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
28390 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
283a0 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
283b0 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
283c0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
283d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
283e0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
283f0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
28400 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
28410 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
28420 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
28430 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
28440 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
28450 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
28460 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
28470 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
28480 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
28490 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
284a0 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
284b0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
284c0 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
284d0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
284e0 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
284f0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
28500 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
28510 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
28520 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
28530 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
28540 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
28550 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
28560 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
28570 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
28580 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
28590 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
285a0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
285b0 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
285c0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
285d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
285e0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
285f0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
28600 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
28610 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28620 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
28630 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
28640 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
28650 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28660 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
28670 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
28680 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
28690 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
286a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
286b0 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
286c0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
286d0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
286e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
286f0 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
28700 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
28710 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
28720 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
28730 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
28740 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
28750 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
28760 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
28770 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
28780 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
28790 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
287a0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
287b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
287c0 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
287d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
287e0 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
287f0 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
28800 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
28810 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
28820 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
28830 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
28840 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
28850 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
28860 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
28870 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
28880 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
28890 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
288a0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
288b0 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
288c0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
288d0 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
288e0 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
288f0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
28900 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
28910 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
28920 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
28930 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
28940 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
28950 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
28960 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
28970 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
28980 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
28990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
289a0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
289b0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
289c0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
289d0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
289e0 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
289f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
28a00 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
28a10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28a20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
28a30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28a40 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
28a50 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
28a60 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
28a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28a80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28a90 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
28aa0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
28ab0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
28ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
28ad0 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
28ae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28af0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
28b00 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65  );..      k = ge
28b10 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
28b20 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20  aData[4]); /* # 
28b30 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69  of leaves on thi
28b40 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  s trunk page */.
28b50 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
28b60 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
28b70 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28b80 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
28b90 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
28ba0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
28bb0 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
28bc0 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
28bd0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
28be0 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
28bf0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
28c00 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
28c10 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
28c20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
28c30 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
28c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28c50 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
28c60 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
28c70 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
28c80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28c90 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
28ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28cb0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
28cc0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
28cd0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
28ce0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
28cf0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
28d00 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
28d10 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
28d20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
28d30 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
28d40 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
28d50 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
28d60 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
28d70 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
28d80 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
28d90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
28da0 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
28db0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
28dc0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
28dd0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
28de0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
28df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
28e00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
28e10 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
28e20 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
28e30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28e40 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
28e50 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
28e60 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
28e70 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
28e80 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
28e90 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
28ea0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
28eb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
28ec0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
28ed0 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
28ee0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
28ef0 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
28f00 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
28f10 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
28f20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
28f30 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
28f40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
28f50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
28f60 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
28f70 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
28f80 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
28f90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28fa0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28fb0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
28fc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
28fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
28fe0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
28ff0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
29000 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
29010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29020 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
29030 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
29040 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
29050 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
29060 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29070 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29080 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29090 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
290a0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
290b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
290c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
290d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
290e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
290f0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29100 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29110 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29120 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
29130 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
29140 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29170 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
29180 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
29190 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
291a0 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
291b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
291c0 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
291d0 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
291e0 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
291f0 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
29200 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
29210 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
29220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
29230 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
29240 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
29250 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
29260 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
29270 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
29280 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
29290 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
292a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
292b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
292c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
292d0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
292e0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
292f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29300 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
29310 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
29320 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
29330 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29340 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
29350 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
29360 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29380 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29390 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
293a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
293b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
293c0 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
293d0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
293e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
293f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29400 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
29410 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
29420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
29430 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
29440 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
29450 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
29460 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
29470 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
29480 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
29490 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
294a0 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
294b0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
294c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
294d0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
294e0 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
294f0 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
29500 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
29510 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
29520 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
29530 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
29540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29550 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
29560 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
29570 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
29580 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
29590 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
295a0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
295b0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
295c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
295d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
295e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
295f0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
29600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
29610 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
29620 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29630 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29640 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29650 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
29660 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
29670 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
29680 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
29690 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
296a0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
296b0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
296c0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
296d0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
296e0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
296f0 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
29700 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29710 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
29720 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
29730 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
29740 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
29750 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
29760 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
29770 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
29780 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
29790 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
297a0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
297b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
297c0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
297d0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
297e0 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
297f0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
29800 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
29810 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
29820 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
29830 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
29840 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
29850 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
29860 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29880 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
298a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
298b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
298c0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
298d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
298e0 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
298f0 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
29900 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
29910 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
29920 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
29930 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
29940 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
29950 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
29960 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
29970 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
29980 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
29990 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
299a0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
299b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
299c0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
299e0 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
299f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29a10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
29a20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
29a30 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
29a40 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
29a50 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
29a60 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
29a70 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
29a80 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
29a90 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
29aa0 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
29ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
29ac0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
29ad0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
29ae0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29af0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
29b00 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
29b10 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
29b20 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
29b30 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20  ( !searchList . 
29b40 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67          || (iPag
29b50 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50  e==nearby || (iP
29b60 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  age<nearby && eM
29b70 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
29b80 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
29b90 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
29ba0 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
29bb0 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
29bc0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
29bd0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
29be0 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
29bf0 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
29c20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
29c30 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
29c40 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
29c50 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
29c60 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
29c70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29c80 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
29c90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
29ca0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29cb0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
29cc0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
29cd0 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
29ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
29cf0 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
29d00 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
29d10 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
29d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29d30 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
29d40 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
29d50 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
29d60 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
29d70 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
29d80 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
29d90 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
29da0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
29db0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
29dc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29de0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
29df0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29e00 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
29e10 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29e20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29e30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29e40 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
29e50 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
29e60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29e80 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
29e90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29ea0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
29eb0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
29ec0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
29ed0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
29ee0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
29ef0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
29f00 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
29f10 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
29f20 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
29f30 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
29f40 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
29f50 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
29f60 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
29f70 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
29f80 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
29f90 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
29fa0 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
29fb0 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
29fc0 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
29fd0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
29fe0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
29ff0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
2a000 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
2a010 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
2a020 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
2a030 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
2a040 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
2a050 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2a060 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
2a070 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
2a080 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
2a090 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
2a0a0 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
2a0b0 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
2a0c0 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
2a0d0 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
2a0e0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
2a0f0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
2a100 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
2a110 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
2a120 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
2a130 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
2a140 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
2a150 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
2a160 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
2a170 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
2a180 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
2a190 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
2a1a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
2a1b0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
2a1c0 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
2a1d0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
2a1e0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
2a1f0 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
2a200 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
2a210 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
2a220 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2a230 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
2a240 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
2a250 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
2a260 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
2a270 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
2a280 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
2a290 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
2a2a0 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
2a2b0 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
2a2c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
2a2d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2a2e0 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
2a2f0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2a300 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
2a310 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
2a320 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
2a330 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
2a340 63 61 74 65 29 29 3b 0a 0a 20 20 20 20 72 63 20  cate));..    rc 
2a350 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a360 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
2a370 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2a380 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2a390 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  c;.    pBt->nPag
2a3a0 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74  e++;.    if( pBt
2a3b0 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
2a3c0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2a3d0 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  ) pBt->nPage++;.
2a3e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a3f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2a400 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2a410 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
2a420 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
2a430 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20  t->nPage) ){.   
2a440 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
2a450 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
2a460 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
2a470 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
2a480 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
2a490 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2a4a0 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
2a4b0 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
2a4c0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
2a4d0 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
2a4e0 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
2a4f0 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
2a500 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
2a510 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
2a520 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
2a530 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
2a540 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2a550 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
2a560 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
2a570 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74  ap page)\n", pBt
2a580 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20  ->nPage));.     
2a590 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
2a5a0 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age!=PENDING_BYT
2a5b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
2a5c0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2a5d0 65 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  etPage(pBt, pBt-
2a5e0 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e  >nPage, &pPg, bN
2a5f0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
2a600 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a610 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2a620 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2a630 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
2a640 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
2a650 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
2a660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a670 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2a680 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
2a690 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ++;.      if( pB
2a6a0 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
2a6b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2a6c0 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b   ){ pBt->nPage++
2a6d0 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
2a6e0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38  .    put4byte(28
2a6f0 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61   + (u8*)pBt->pPa
2a700 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  ge1->aData, pBt-
2a710 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50  >nPage);.    *pP
2a720 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  gno = pBt->nPage
2a730 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  ;..    assert( *
2a740 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
2a750 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2a760 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
2a770 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
2a780 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43  no, ppPage, bNoC
2a790 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  ontent);.    if(
2a7a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a7b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a7c0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2a7d0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2a7e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2a7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a800 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2a810 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2a820 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2a830 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
2a840 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
2a850 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
2a860 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2a870 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2a880 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
2a890 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
2a8a0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
2a8b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2a8c0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
2a8d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a8e0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2a8f0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2a900 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
2a910 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
2a920 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2a930 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
2a940 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2a950 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2a960 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
2a970 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
2a980 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
2a990 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2a9a0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2a9b0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2a9c0 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
2a9d0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
2a9e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2a9f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2aa00 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2aa10 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
2aa20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2aa30 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
2aa40 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
2aa50 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
2aa60 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2aa70 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
2aa80 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
2aa90 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2aaa0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2aab0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2aac0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
2aad0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
2aae0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
2aaf0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
2ab00 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
2ab10 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
2ab20 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
2ab30 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
2ab40 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
2ab50 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
2ab60 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
2ab70 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
2ab80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
2ab90 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
2aba0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
2abb0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2abc0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
2abd0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
2abe0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
2abf0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2ac00 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2ac10 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
2ac20 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
2ac30 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
2ac40 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
2ac50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
2ac80 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
2ac90 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2acc0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
2acd0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
2ace0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
2acf0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
2ad00 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
2ad10 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
2ad20 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2ad30 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2ad40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2ad50 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
2ad60 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
2ad70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2ada0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
2adb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2adc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2add0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2ade0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
2adf0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
2ae00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2ae10 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2ae20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
2ae30 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
2ae40 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
2ae50 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
2ae60 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
2ae70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
2ae80 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
2ae90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2aea0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
2aeb0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2aec0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
2aed0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2aee0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
2aef0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2af00 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
2af10 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
2af20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2af30 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2af40 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2af50 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2af60 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
2af70 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2af80 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2af90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2afa0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
2afb0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
2afc0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2afd0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
2afe0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2aff0 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
2b000 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2b010 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
2b020 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
2b030 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
2b040 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
2b050 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2b060 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
2b070 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2b080 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2b090 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
2b0a0 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
2b0b0 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
2b0c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2b0d0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
2b0e0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
2b0f0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2b100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
2b110 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
2b120 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
2b130 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
2b140 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2b150 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
2b160 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
2b170 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2b180 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
2b190 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
2b1a0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
2b1b0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
2b1c0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2b1d0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2b1e0 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
2b1f0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
2b200 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
2b210 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2b220 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
2b230 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
2b240 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
2b250 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
2b260 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
2b270 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
2b280 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
2b290 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
2b2a0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
2b2b0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
2b2c0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
2b2d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2b2e0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
2b2f0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2b300 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
2b310 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2b320 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2b330 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
2b340 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
2b350 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
2b360 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
2b370 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
2b380 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
2b390 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
2b3a0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
2b3b0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
2b3c0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
2b3d0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
2b3e0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
2b3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b400 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2b410 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
2b420 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
2b430 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
2b440 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2b450 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
2b460 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2b470 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2b480 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2b490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b4a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2b4b0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2b4c0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
2b4d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2b4e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
2b4f0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2b500 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
2b510 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
2b520 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
2b530 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
2b540 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b550 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2b560 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2b570 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2b580 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
2b590 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2b5a0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
2b5b0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2b5c0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
2b5d0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
2b5e0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
2b5f0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
2b600 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
2b610 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
2b620 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
2b630 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
2b640 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
2b650 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
2b660 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
2b670 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2b680 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
2b690 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2b6a0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
2b6b0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
2b6c0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
2b6d0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2b6e0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
2b6f0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
2b700 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
2b710 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
2b720 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2b730 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
2b740 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
2b750 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2b760 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
2b770 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
2b780 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
2b790 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
2b7a0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
2b7b0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
2b7c0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
2b7d0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
2b7e0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
2b7f0 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
2b800 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2b810 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
2b820 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
2b830 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
2b840 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
2b850 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
2b860 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
2b870 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
2b880 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
2b890 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
2b8a0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
2b8b0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2b8c0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
2b8d0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
2b8e0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
2b8f0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
2b900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b910 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b920 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2b930 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2b940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b950 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2b960 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2b970 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
2b980 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2b990 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2b9a0 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
2b9b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2b9c0 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
2b9d0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2b9e0 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
2b9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2ba00 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2ba10 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2ba20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2ba30 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2ba40 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
2ba50 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
2ba60 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
2ba70 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2ba80 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
2ba90 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
2baa0 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
2bab0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
2bac0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2bad0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2bae0 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
2baf0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
2bb00 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
2bb10 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2bb20 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
2bb30 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2bb40 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
2bb50 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
2bb60 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2bb70 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
2bb80 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
2bb90 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
2bba0 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
2bbb0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
2bbc0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2bbd0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2bbe0 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
2bbf0 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2bc00 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
2bc10 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
2bc20 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2bc30 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2bc40 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
2bc50 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
2bc60 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
2bc70 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2bc80 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
2bc90 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2bca0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
2bcb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2bcc0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2bcd0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
2bce0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
2bcf0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2bd00 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
2bd10 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
2bd20 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
2bd30 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2bd40 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
2bd50 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2bd60 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
2bd70 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2bd80 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
2bd90 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
2bda0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2bdb0 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
2bdc0 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
2bdd0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2bde0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2bdf0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
2be00 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2be10 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2be20 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
2be30 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2be40 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
2be50 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
2be60 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
2be70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2be80 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
2be90 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
2bea0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
2beb0 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
2bec0 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
2bed0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2bee0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
2bef0 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
2bf00 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
2bf10 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2bf20 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
2bf30 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
2bf40 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2bf50 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2bf60 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2bf70 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2bf80 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2bf90 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2bfa0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2bfb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2bfc0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2bfd0 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2bfe0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2bff0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2c000 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
2c010 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
2c020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c030 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
2c040 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
2c050 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2c060 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2c070 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
2c080 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
2c090 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
2c0a0 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
2c0b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c0c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
2c0d0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
2c0e0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
2c0f0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
2c100 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
2c110 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2c120 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
2c130 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2c140 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
2c150 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2c160 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
2c170 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
2c180 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
2c190 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
2c1a0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
2c1b0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
2c1c0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
2c1d0 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
2c1e0 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
2c1f0 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
2c200 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2c210 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
2c220 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
2c230 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
2c240 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
2c250 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
2c260 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
2c270 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
2c280 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
2c290 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2c2a0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
2c2b0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
2c2c0 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
2c2d0 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
2c2e0 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
2c2f0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2c300 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
2c310 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2c320 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2c330 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
2c340 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2c350 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
2c360 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
2c370 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
2c380 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2c390 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2c3a0 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
2c3b0 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
2c3c0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
2c3d0 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
2c3e0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2c3f0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
2c400 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
2c410 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
2c420 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
2c430 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
2c440 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
2c450 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2c460 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
2c470 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2c480 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
2c490 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
2c4a0 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
2c4b0 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
2c4c0 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
2c4d0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
2c4e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2c4f0 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
2c500 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
2c510 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
2c520 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
2c530 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
2c540 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2c550 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
2c560 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
2c570 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
2c580 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
2c590 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
2c5a0 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
2c5b0 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
2c5c0 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
2c5d0 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
2c5e0 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
2c5f0 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
2c600 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
2c610 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
2c620 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
2c630 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
2c640 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
2c650 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
2c660 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
2c670 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
2c680 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
2c690 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2c6a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c6b0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2c6c0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2c6d0 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
2c6e0 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
2c6f0 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
2c700 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c710 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
2c720 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c730 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
2c740 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
2c750 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
2c760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c770 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2c780 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
2c790 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
2c7a0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
2c7b0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
2c7c0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
2c7d0 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
2c7e0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
2c7f0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
2c800 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
2c810 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
2c820 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
2c830 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
2c840 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
2c850 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2c860 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
2c870 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
2c880 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
2c890 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
2c8a0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
2c8b0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
2c8c0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
2c8d0 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
2c8e0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
2c8f0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
2c900 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
2c910 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
2c920 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
2c930 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
2c940 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
2c950 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
2c960 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
2c970 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
2c980 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2c990 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2c9a0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
2c9b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2c9c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2c9d0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
2c9e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2c9f0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
2ca00 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
2ca10 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
2ca20 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2ca30 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2ca40 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
2ca50 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2ca60 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
2ca70 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
2ca80 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2caa0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
2cab0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
2cac0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
2cad0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2cae0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2caf0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
2cb00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
2cb10 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
2cb20 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
2cb30 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
2cb40 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
2cb50 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2cb60 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
2cb70 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
2cb80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2cb90 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
2cba0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
2cbb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2cbc0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2cbd0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
2cbe0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
2cbf0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
2cc00 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
2cc10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2cc20 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2cc30 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
2cc40 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
2cc50 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
2cc60 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
2cc70 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
2cc80 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
2cc90 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
2cca0 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
2ccb0 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
2ccc0 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
2ccd0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2cce0 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
2ccf0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2cd00 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2cd10 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2cd20 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2cd30 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2cd40 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2cd50 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
2cd60 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
2cd70 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2cd80 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2cd90 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
2cda0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
2cdb0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
2cdc0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
2cdd0 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e  Header], nData+n
2cde0 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Zero);.  }else{.
2cdf0 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72      nData = nZer
2ce00 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  o = 0;.  }.  nHe
2ce10 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2ce20 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
2ce30 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
2ce40 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2ce50 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2ce60 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
2ce70 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
2ce80 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
2ce90 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
2cea0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
2ceb0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
2cec0 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a  ==(u32)(nData+nZ
2ced0 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  ero) );.  .  /* 
2cee0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
2cef0 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
2cf00 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
2cf10 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
2cf20 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
2cf30 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2cf40 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2cf50 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
2cf60 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e  else{ .    if( N
2cf70 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66  EVER(nKey>0x7fff
2cf80 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29  ffff || pKey==0)
2cf90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2cfa0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2cfb0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2cfc0 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
2cfd0 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
2cfe0 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
2cff0 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
2d000 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
2d010 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
2d020 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
2d030 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
2d040 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
2d050 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
2d060 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
2d070 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
2d080 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
2d090 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
2d0a0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
2d0b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2d0c0 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
2d0d0 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
2d0e0 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
2d0f0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
2d100 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
2d110 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
2d120 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2d130 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
2d140 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
2d150 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
2d160 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
2d170 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
2d180 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
2d190 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
2d1a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
2d1b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2d1c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
2d1d0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2d1e0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
2d1f0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
2d200 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
2d210 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d220 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2d230 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2d240 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
2d250 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
2d260 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
2d270 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
2d280 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
2d290 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
2d2a0 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
2d2b0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2d2c0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
2d2d0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
2d2e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2d2f0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2d300 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
2d310 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
2d320 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
2d330 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2d340 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
2d350 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
2d360 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
2d370 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
2d380 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
2d390 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
2d3a0 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
2d3b0 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
2d3c0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
2d3d0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
2d3e0 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
2d3f0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
2d400 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
2d410 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
2d420 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
2d430 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2d440 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2d450 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2d460 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2d470 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
2d480 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
2d490 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
2d4a0 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
2d4b0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2d4c0 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
2d4d0 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
2d4e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2d4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
2d500 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
2d510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d520 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
2d530 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2d540 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2d550 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
2d560 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d570 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2d580 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2d590 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2d5a0 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
2d5b0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2d5c0 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
2d5d0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2d5e0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2d5f0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2d600 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2d610 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
2d620 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2d630 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
2d640 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
2d650 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2d660 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
2d670 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
2d680 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
2d690 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
2d6a0 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
2d6b0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2d6c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
2d6d0 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
2d6e0 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
2d6f0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2d700 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2d710 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2d720 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d730 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2d740 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
2d750 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
2d760 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
2d770 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2d780 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
2d790 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
2d7a0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
2d7b0 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
2d7c0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2d7d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
2d7e0 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
2d7f0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
2d800 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
2d810 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2d820 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
2d830 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
2d840 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
2d850 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
2d860 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
2d870 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
2d880 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
2d890 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2d8a0 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
2d8b0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
2d8c0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
2d8d0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
2d8e0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
2d8f0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2d900 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2d910 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d920 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2d930 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
2d940 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
2d950 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2d960 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2d970 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2d980 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
2d990 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2d9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
2d9b0 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
2d9c0 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
2d9d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2d9e0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2d9f0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2da00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2da10 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2da20 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
2da30 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
2da40 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
2da50 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
2da60 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
2da70 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
2da80 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
2da90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2daa0 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
2dab0 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
2dac0 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
2dad0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
2dae0 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
2daf0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
2db00 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
2db10 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
2db20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
2db30 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
2db40 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2db50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
2db60 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2db70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
2db80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2db90 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
2dba0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
2dbb0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2dbc0 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
2dbd0 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
2dbe0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
2dbf0 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
2dc00 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
2dc10 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
2dc20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
2dc30 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
2dc40 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
2dc50 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
2dc60 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
2dc70 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2dc80 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2dc90 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
2dca0 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
2dcb0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
2dcc0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
2dcd0 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
2dce0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
2dcf0 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
2dd00 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
2dd10 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
2dd20 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
2dd30 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
2dd40 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
2dd50 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2dd60 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
2dd70 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
2dd80 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2dd90 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
2dda0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
2ddb0 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b  */.  u8 *endPtr;
2ddc0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
2ddd0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  oop */.  int rc;
2dde0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ddf0 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
2de00 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
2de10 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
2de20 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
2de30 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
2de40 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
2de50 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2de60 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
2de70 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
2de80 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
2de90 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2dea0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
2deb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2dec0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2ded0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2dee0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2def0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2df00 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2df10 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
2df20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2df30 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
2df40 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
2df50 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
2df60 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
2df70 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2df80 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
2df90 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2dfa0 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
2dfb0 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
2dfc0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2dfd0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
2dfe0 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
2dff0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
2e000 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
2e010 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2e020 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
2e030 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2e040 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
2e050 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
2e060 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
2e070 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
2e080 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2e090 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2e0a0 20 65 6e 64 50 74 72 20 3d 20 26 70 50 61 67 65   endPtr = &pPage
2e0b0 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 70 50 61  ->aCellIdx[2*pPa
2e0c0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32 5d 3b 0a  ge->nCell - 2];.
2e0d0 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
2e0e0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72  E_PTR_TO_INT(ptr
2e0f0 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70  )&1)==0 );  /* p
2e100 74 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62  tr is always 2-b
2e110 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20  yte aligned */. 
2e120 20 77 68 69 6c 65 28 20 70 74 72 3c 65 6e 64 50   while( ptr<endP
2e130 74 72 20 29 7b 0a 20 20 20 20 2a 28 75 31 36 2a  tr ){.    *(u16*
2e140 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70  )ptr = *(u16*)&p
2e150 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 20 2b  tr[2];.    ptr +
2e160 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 2;.  }.  pPage
2e170 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
2e180 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2e190 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2e1a0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2e1b0 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e += 2;.}../*.**
2e1c0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
2e1d0 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
2e1e0 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
2e1f0 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
2e200 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
2e210 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
2e220 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
2e230 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
2e240 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
2e250 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
2e260 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
2e270 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
2e280 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
2e290 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
2e2a0 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
2e2b0 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
2e2c0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
2e2d0 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
2e2e0 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
2e2f0 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
2e300 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
2e310 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
2e320 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
2e330 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
2e340 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
2e350 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
2e360 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
2e370 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
2e380 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
2e390 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
2e3a0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
2e3b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
2e3c0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
2e3d0 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
2e3e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
2e3f0 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
2e400 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
2e410 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
2e420 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
2e430 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
2e440 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2e450 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
2e460 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
2e470 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
2e480 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
2e490 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
2e4a0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
2e4b0 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
2e4c0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
2e4d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e4e0 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
2e4f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2e500 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
2e510 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
2e520 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
2e530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2e540 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
2e550 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
2e560 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
2e570 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
2e580 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2e590 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
2e5a0 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
2e5b0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
2e5c0 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
2e5d0 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
2e5e0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
2e5f0 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
2e600 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
2e610 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
2e620 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
2e630 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
2e640 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
2e650 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
2e660 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
2e670 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
2e680 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
2e690 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
2e6a0 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
2e6b0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
2e6c0 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
2e6d0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
2e6e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
2e6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2e700 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
2e710 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
2e720 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
2e730 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
2e740 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2e750 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
2e760 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
2e770 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
2e780 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
2e790 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
2e7a0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
2e7b0 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
2e7c0 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
2e7d0 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
2e7e0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
2e7f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2e800 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2e810 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
2e820 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
2e830 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f    /* Used for mo
2e840 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ving information
2e850 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b   around in data[
2e860 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74  ] */.  u8 *endPt
2e870 72 3b 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  r;       /* End 
2e880 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 0a  of the loop */..
2e890 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69    int nSkip = (i
2e8a0 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a  Child ? 4 : 0);.
2e8b0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2e8c0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2e8d0 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
2e8e0 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
2e8f0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
2e900 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2e910 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
2e920 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
2e930 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
2e940 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
2e950 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2e960 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
2e970 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
2e980 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
2e990 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
2e9a0 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
2e9b0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
2e9c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2e9d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2e9e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2e9f0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
2ea00 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
2ea10 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
2ea20 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
2ea30 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
2ea40 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
2ea50 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
2ea60 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
2ea70 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
2ea80 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
2ea90 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
2eaa0 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
2eab0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
2eac0 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
2ead0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
2eae0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
2eaf0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
2eb00 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
2eb10 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
2eb20 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
2eb30 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
2eb40 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2eb50 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
2eb60 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2eb70 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2eb80 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
2eb90 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
2eba0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2ebb0 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
2ebc0 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
2ebd0 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
2ebe0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2ebf0 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
2ec00 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
2ec10 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
2ec20 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
2ec30 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2ec40 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
2ec50 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
2ec60 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
2ec70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
2ec80 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
2ec90 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
2eca0 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  >apOvfl)/sizeof(
2ecb0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d  pPage->apOvfl[0]
2ecc0 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  )) );.    pPage-
2ecd0 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65  >apOvfl[j] = pCe
2ece0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
2ecf0 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29  iOvfl[j] = (u16)
2ed00 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
2ed10 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2ed20 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2ed30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ed40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ed50 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
2ed60 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
2ed70 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rn;.    }.    as
2ed80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2ed90 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2eda0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2edb0 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
2edc0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65  e->aData;.    ce
2edd0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
2ede0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
2edf0 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
2ee00 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
2ee10 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  ell;.    ins = c
2ee20 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
2ee30 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
2ee40 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
2ee50 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
2ee60 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
2ee70 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
2ee80 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
2ee90 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
2eea0 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
2eeb0 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f  ollowing two pro
2eec0 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
2eed0 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
2eee0 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  cess */.    asse
2eef0 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32  rt( idx >= end+2
2ef00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ef10 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70  idx+sz <= (int)p
2ef20 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2ef30 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
2ef40 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
2ef50 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
2ef60 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
2ef70 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2ef80 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
2ef90 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
2efa0 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68  ip);.    if( iCh
2efb0 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2efc0 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  4byte(&data[idx]
2efd0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
2efe0 0a 20 20 20 20 70 74 72 20 3d 20 26 64 61 74 61  .    ptr = &data
2eff0 5b 65 6e 64 5d 3b 0a 20 20 20 20 65 6e 64 50 74  [end];.    endPt
2f000 72 20 3d 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0a  r = &data[ins];.
2f010 20 20 20 20 61 73 73 65 72 74 28 20 28 53 51 4c      assert( (SQL
2f020 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
2f030 74 72 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a  tr)&1)==0 );  /*
2f040 20 70 74 72 20 69 73 20 61 6c 77 61 79 73 20 32   ptr is always 2
2f050 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f  -byte aligned */
2f060 0a 20 20 20 20 77 68 69 6c 65 28 20 70 74 72 3e  .    while( ptr>
2f070 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 20 20  endPtr ){.      
2f080 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75  *(u16*)ptr = *(u
2f090 31 36 2a 29 26 70 74 72 5b 2d 32 5d 3b 0a 20 20  16*)&ptr[-2];.  
2f0a0 20 20 20 20 70 74 72 20 2d 3d 20 32 3b 0a 20 20      ptr -= 2;.  
2f0b0 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
2f0c0 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
2f0d0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
2f0e0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
2f0f0 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
2f100 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
2f110 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2f120 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2f130 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
2f140 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2f150 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
2f160 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
2f170 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
2f180 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
2f190 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
2f1a0 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
2f1b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
2f1c0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2f1d0 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
2f1e0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2f1f0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2f200 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
2f210 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2f220 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
2f230 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
2f240 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
2f250 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
2f260 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
2f270 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
2f280 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
2f290 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2f2a0 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
2f2b0 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
2f2c0 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
2f2d0 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
2f2e0 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
2f2f0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
2f300 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
2f310 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
2f320 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
2f330 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
2f340 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
2f350 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
2f360 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
2f370 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
2f380 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
2f390 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
2f3a0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2f3b0 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
2f3c0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2f3d0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
2f3e0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
2f3f0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
2f400 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2f410 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
2f420 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
2f430 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
2f440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2f450 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
2f460 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
2f470 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
2f480 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
2f490 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2f4a0 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
2f4b0 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2f4c0 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
2f4d0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2f4e0 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
2f4f0 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
2f500 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2f510 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2f520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2f530 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2f540 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2f550 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2f560 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
2f570 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28  l<=(int)MX_CELL(
2f580 70 50 61 67 65 2d 3e 70 42 74 29 0a 20 20 20 20  pPage->pBt).    
2f590 20 20 20 20 20 20 20 20 26 26 20 28 69 6e 74 29          && (int)
2f5a0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2f5b0 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61  Bt)<=10921);.  a
2f5c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2f5d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2f5e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2f5f0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2f600 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
2f610 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
2f620 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
2f630 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2f640 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2f650 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
2f660 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
2f670 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
2f680 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
2f690 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
2f6a0 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  x[nCell*2];.  ce
2f6b0 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
2f6c0 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
2f6d0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2f6e0 20 20 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a     u16 sz = aSiz
2f6f0 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70  e[i];.    pCellp
2f700 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
2f710 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20  lbody -= sz;.   
2f720 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
2f730 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  tr, cellbody);. 
2f740 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
2f750 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
2f760 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20  l[i], sz);.  }. 
2f770 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2f780 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
2f790 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2f7a0 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
2f7b0 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
2f7c0 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
2f7d0 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
2f7e0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2f7f0 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
2f800 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
2f810 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
2f820 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
2f830 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
2f840 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
2f850 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
2f860 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2f870 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
2f880 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2f890 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
2f8a0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
2f8b0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
2f8c0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
2f8d0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
2f8e0 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
2f8f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
2f900 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
2f910 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
2f920 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
2f930 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
2f940 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
2f950 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
2f960 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
2f970 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
2f980 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
2f990 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
2f9a0 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
2f9b0 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
2f9c0 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
2f9d0 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
2f9e0 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
2f9f0 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
2fa00 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
2fa10 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
2fa20 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
2fa30 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
2fa40 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
2fa50 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
2fa60 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
2fa70 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
2fa80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa90 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2faa0 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
2fab0 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
2fac0 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
2fad0 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
2fae0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
2faf0 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
2fb00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
2fb10 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
2fb20 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
2fb30 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
2fb40 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
2fb50 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
2fb60 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
2fb70 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
2fb80 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
2fb90 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
2fba0 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
2fbb0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
2fbc0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
2fbd0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
2fbe0 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
2fbf0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
2fc00 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
2fc10 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20  ying to balance 
2fc20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
2fc30 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
2fc40 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
2fc50 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
2fc60 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
2fc70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
2fc80 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
2fc90 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
2fca0 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
2fcb0 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
2fcc0 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
2fcd0 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
2fce0 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
2fcf0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
2fd00 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
2fd10 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
2fd20 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
2fd30 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
2fd40 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
2fd50 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
2fd60 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
2fd70 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
2fd80 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
2fd90 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
2fda0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
2fdb0 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
2fdc0 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
2fdd0 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
2fde0 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
2fdf0 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
2fe00 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
2fe10 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
2fe20 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53  ge..**.** The pS
2fe30 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75  pace buffer is u
2fe40 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74  sed to store a t
2fe50 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66  emporary copy of
2fe60 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20   the divider.** 
2fe70 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62  cell that will b
2fe80 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2fe90 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20  pParent. Such a 
2fea0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
2feb0 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67   a 4.** byte pag
2fec0 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65  e number followe
2fed0 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
2fee0 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
2fef0 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
2ff00 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79  s, at most 13 by
2ff10 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70  tes. Hence the p
2ff20 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73  Space buffer mus
2ff30 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74  t be at.** least
2ff40 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
2ff50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2ff60 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
2ff70 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2ff80 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2ff90 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20   u8 *pSpace){.  
2ffa0 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20  BtShared *const 
2ffb0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2ffc0 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44  ;    /* B-Tree D
2ffd0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d  atabase */.  Mem
2ffe0 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Page *pNew;     
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30000 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
30010 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ated page */.  i
30020 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
30030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30040 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
30050 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  de */.  Pgno pgn
30060 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  oNew;           
30070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30080 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
30090 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  New */..  assert
300a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
300b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
300c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
300d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
300e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
300f0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
30100 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
30110 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
30120 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  );..  /* This er
30130 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ror condition is
30140 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
30150 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
30160 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
30170 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
30180 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
30190 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
301a0 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
301b0 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
301c0 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
301d0 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
301e0 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
301f0 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
30200 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
30210 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
30220 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
30230 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
30240 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
30250 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
30260 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
30270 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
30280 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
30290 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
302a0 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
302b0 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
302c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
302d0 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
302e0 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
302f0 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
30300 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75  apOvfl[0];.    u
30310 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
30320 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
30330 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
30340 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
30350 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
30360 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
30370 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
30380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
30390 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
303a0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
303b0 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
303c0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
303d0 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
303e0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
303f0 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
30400 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
30410 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
30420 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
30430 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
30440 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
30450 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
30460 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
30470 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
30480 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
30490 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
304a0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
304b0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
304c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
304d0 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
304e0 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
304f0 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
30500 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
30510 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
30520 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
30530 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
30540 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
30550 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
30560 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
30570 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
30580 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
30590 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
305a0 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
305b0 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
305c0 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
305d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
305e0 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
305f0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
30600 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
30610 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
30620 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
30630 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
30640 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
30650 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
30660 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
30670 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
30680 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
30690 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
306a0 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
306b0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
306c0 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
306d0 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
306e0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
306f0 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
30700 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
30710 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
30720 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
30730 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
30740 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
30750 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
30760 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
30770 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
30780 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
30790 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
307a0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
307b0 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
307c0 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
307d0 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
307e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
307f0 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
30800 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
30810 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
30820 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
30830 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
30840 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
30850 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
30860 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
30870 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
30880 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
30890 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
308a0 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
308b0 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
308c0 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
308d0 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
308e0 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
308f0 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
30900 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
30910 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
30920 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
30930 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
30940 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
30950 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
30960 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
30970 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
30980 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
30990 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
309a0 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
309b0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
309c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
309d0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
309e0 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
309f0 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
30a00 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
30a10 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
30a20 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
30a30 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
30a40 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
30a50 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
30a60 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
30a70 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
30a80 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
30a90 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
30aa0 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
30ab0 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
30ac0 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
30ad0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
30ae0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
30af0 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
30b00 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
30b10 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
30b20 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
30b30 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
30b40 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
30b50 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
30b60 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
30b70 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
30b80 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
30b90 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
30ba0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
30bb0 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
30bc0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
30bd0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
30be0 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
30bf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
30c00 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
30c10 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
30c20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
30c30 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
30c40 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
30c50 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
30c60 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
30c70 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
30c80 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
30c90 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
30ca0 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
30cb0 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
30cc0 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
30cd0 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
30ce0 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
30cf0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
30d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
30d10 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
30d20 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
30d30 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
30d40 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
30d50 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
30d60 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
30d70 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
30d80 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
30d90 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
30da0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
30db0 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
30dc0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
30dd0 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
30de0 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
30df0 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
30e00 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
30e10 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
30e20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
30e30 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
30e40 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
30e50 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
30e60 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
30e70 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
30e80 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
30e90 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
30ea0 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
30eb0 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
30ec0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
30ed0 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
30ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
30ef0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
30f00 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
30f10 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
30f20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
30f30 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
30f40 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
30f50 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
30f60 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
30f70 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
30f80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30f90 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
30fa0 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
30fb0 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
30fc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
30fd0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
30fe0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
30ff0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
31000 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
31010 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
31020 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
31030 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
31040 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31050 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
31060 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
31070 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
31080 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
31090 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
310a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
310b0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
310c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
310d0 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
310e0 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
310f0 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
31100 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
31110 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
31120 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
31130 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
31140 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
31150 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
31160 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
31170 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
31180 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
31190 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
311a0 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
311b0 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
311c0 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
311d0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
311e0 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
311f0 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
31200 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
31210 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
31220 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
31230 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
31240 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
31250 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
31260 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
31270 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
31280 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
31290 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d  MemPage.apOvfl[]
312a0 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
312b0 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
312c0 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
312d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
312e0 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
312f0 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
31300 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
31310 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
31320 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
31330 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
31340 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
31350 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
31360 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
31370 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
31380 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
31390 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
313a0 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
313b0 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
313c0 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
313d0 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
313e0 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
313f0 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
31400 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
31410 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
31420 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
31430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
31440 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
31450 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
31460 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
31470 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
31480 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
31490 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
314a0 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
314b0 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
314c0 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
314d0 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
314e0 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
314f0 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
31500 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  : 0);.    int rc
31510 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b  ;.    int iData;
31520 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72  .  .  .    asser
31530 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74  t( pFrom->isInit
31540 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31550 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
31560 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  oHdr );.    asse
31570 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
31580 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
31590 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
315a0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
315b0 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
315c0 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
315d0 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
315e0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
315f0 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
31600 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
31610 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
31620 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
31630 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
31640 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
31650 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
31660 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
31670 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
31680 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
31690 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
316a0 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
316b0 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
316c0 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
316d0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
316e0 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
316f0 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
31700 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
31710 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
31720 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
31730 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
31740 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
31750 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
31760 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
31770 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
31780 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
31790 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
317a0 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
317b0 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
317c0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
317d0 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
317e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
317f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31800 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
31810 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
31820 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
31830 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
31840 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
31850 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
31860 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
31870 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
31880 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
31890 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
318a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
318b0 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
318c0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
318d0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
318e0 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
318f0 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
31900 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
31910 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
31920 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
31930 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
31940 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
31950 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
31960 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
31970 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
31980 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
31990 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
319a0 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
319b0 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
319c0 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
319d0 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
319e0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
319f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
31a00 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
31a10 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
31a20 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
31a30 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
31a40 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
31a50 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
31a60 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
31a70 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
31a80 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
31a90 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
31aa0 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
31ab0 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
31ac0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
31ad0 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
31ae0 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
31af0 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
31b00 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
31b10 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
31b20 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
31b30 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
31b40 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
31b50 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
31b60 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
31b70 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
31b80 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
31b90 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
31ba0 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
31bb0 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
31bc0 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
31bd0 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
31be0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
31bf0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
31c00 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
31c10 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
31c20 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
31c30 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
31c40 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
31c50 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
31c60 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
31c70 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
31c80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
31c90 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
31ca0 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
31cb0 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
31cc0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
31cd0 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
31ce0 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
31cf0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
31d00 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
31d10 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
31d20 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
31d30 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
31d40 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
31d50 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
31d60 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
31d70 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
31d80 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
31d90 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
31da0 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
31db0 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
31dc0 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
31dd0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
31de0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
31df0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
31e00 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
31e10 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
31e20 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
31e30 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
31e40 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
31e50 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
31e60 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
31e70 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
31e80 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
31e90 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
31ea0 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
31eb0 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
31ec0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
31ed0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
31ee0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
31ef0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
31f00 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
31f10 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
31f20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
31f30 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
31f40 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
31f50 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
31f60 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
31f70 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
31f80 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
31f90 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
31fa0 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
31fb0 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
31fc0 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
31fd0 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
31fe0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
31ff0 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
32000 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
32010 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32020 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
32030 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
32040 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
32050 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
32060 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
32070 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
32080 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
32090 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
320a0 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
320b0 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
320c0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
320d0 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
320e0 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
320f0 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
32100 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
32110 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
32120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
32130 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
32140 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
32150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32160 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
32170 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64  _NOMEM..*/.#if d
32180 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
32190 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20   && _MSC_VER >= 
321a0 31 37 30 30 20 26 26 20 64 65 66 69 6e 65 64 28  1700 && defined(
321b0 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61 20  _M_ARM).#pragma 
321c0 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 66 66  optimize("", off
321d0 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
321e0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
321f0 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oot(.  MemPage *
32200 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  pParent,        
32210 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
32220 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67   page of sibling
32230 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
32240 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
32250 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  tIdx,           
32260 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
32270 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20  f "the page" in 
32280 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20  pParent */.  u8 
32290 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20  *aOvflSpace,    
322a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
322b0 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
322c0 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72  of space for par
322d0 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e  ent ovfl */.  in
322e0 74 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20 20  t isRoot,       
322f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32300 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
32310 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   is a root-page 
32320 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20 20  */.  int bBulk  
32330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32340 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
32350 74 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61 72  this call is par
32360 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64  t of a bulk load
32370 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
32380 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
32390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
323a0 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
323b0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
323c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
323d0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
323e0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
323f0 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
32400 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
32410 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
32420 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
32430 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
32440 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
32450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32460 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
32470 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
32480 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
32490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
324a0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
324b0 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
324c0 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
324d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
324e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
324f0 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32510 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
32520 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
32530 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
32540 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32550 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
32560 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
32570 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
32580 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
32590 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
325a0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
325b0 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
325c0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
325d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
325e0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
325f0 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
32600 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
32610 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
32620 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
32630 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
32640 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
32650 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
32660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
32670 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
32680 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
32690 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
326a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
326b0 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
326c0 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
326d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
326e0 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
326f0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
32700 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
32710 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
32720 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
32730 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
32740 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
32750 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
32760 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
32770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32780 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
32790 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
327a0 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
327b0 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
327c0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
327d0 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
327e0 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
327f0 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
32800 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
32810 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
32820 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
32830 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
32840 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
32850 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
32860 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
32870 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
32880 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20   u8 *pRight;    
32890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
328a0 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72   Location in par
328b0 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62  ent of right-sib
328c0 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ling pointer */.
328d0 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31    u8 *apDiv[NB-1
328e0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
328f0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
32900 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
32910 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
32920 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
32930 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
32940 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
32950 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
32960 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
32970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
32980 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
32990 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
329a0 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
329b0 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
329c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
329d0 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
329e0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
329f0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
32a00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
32a10 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
32a20 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
32a30 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
32a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a50 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
32a60 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
32a70 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f   cells */.  Pgno
32a80 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
32a90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
32aa0 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20   var to store a 
32ab0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a  page number in *
32ac0 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  /..  pBt = pPare
32ad0 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
32ae0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
32af0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
32b00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
32b10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32b20 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
32b30 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66  pDbPage) );..#if
32b40 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   0.  TRACE(("BAL
32b50 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
32b60 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
32b70 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
32b80 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
32b90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
32ba0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61  t this point pPa
32bb0 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74  rent may have at
32bc0 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c   most one overfl
32bd0 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a  ow cell. And if.
32be0 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c    ** this overfl
32bf0 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  ow cell is prese
32c00 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  nt, it must be t
32c10 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20  he cell with .  
32c20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74  ** index iParent
32c30 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72  Idx. This scenar
32c40 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  io comes about w
32c50 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
32c60 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  n.  ** is called
32c70 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
32c80 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  om sqlite3BtreeD
32c90 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  elete()..  */.  
32ca0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
32cb0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
32cc0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
32cd0 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  low==1 );.  asse
32ce0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
32cf0 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
32d00 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d  rent->aiOvfl[0]=
32d10 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a  =iParentIdx );..
32d20 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63    if( !aOvflSpac
32d30 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
32d40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
32d50 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
32d60 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
32d70 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20  o balance. Also 
32d80 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73  locate the cells
32d90 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a   in pParent .  *
32da0 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68  * that divide th
32db0 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61  e siblings. An a
32dc0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
32dd0 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
32de0 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68  gs on .  ** eith
32df0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
32e00 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  . More siblings 
32e10 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
32e20 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
32e30 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  , .  ** if there
32e40 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
32e50 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
32e60 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49  he other side. I
32e70 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68  f pParent.  ** h
32e80 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63  as NB or fewer c
32e90 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c  hildren then all
32ea0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
32eb0 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20  rent are taken. 
32ec0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
32ed0 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73   loop also drops
32ee0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
32ef0 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ls from the pare
32f00 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20  nt page. This.  
32f10 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61  ** way, the rema
32f20 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e  inder of the fun
32f30 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68  ction does not h
32f40 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ave to deal with
32f50 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c   any.  ** overfl
32f60 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ow cells in the 
32f70 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e  parent page, sin
32f80 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65  ce if any existe
32f90 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a  d they will.  **
32fa0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
32fb0 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f  en removed..  */
32fc0 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e  .  i = pParent->
32fd0 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72  nOverflow + pPar
32fe0 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  ent->nCell;.  if
32ff0 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44  ( i<2 ){.    nxD
33000 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  iv = 0;.  }else{
33010 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75  .    assert( bBu
33020 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d  lk==0 || bBulk==
33030 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  1 );.    if( iPa
33040 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
33050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
33060 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
33070 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
33080 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
33090 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
330a0 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73  +bBulk;.    }els
330b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
330c0 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20   bBulk==0 );.   
330d0 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
330e0 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
330f0 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a     i = 2-bBulk;.
33100 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31    }.  nOld = i+1
33110 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76  ;.  if( (i+nxDiv
33120 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
33130 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  low)==pParent->n
33140 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67  Cell ){.    pRig
33150 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61  ht = &pParent->a
33160 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
33170 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65  rOffset+8];.  }e
33180 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20  lse{.    pRight 
33190 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
331a0 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
331b0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
331c0 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65  .  }.  pgno = ge
331d0 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a  t4byte(pRight);.
331e0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
331f0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
33200 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
33210 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20   &apOld[i]);.   
33220 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
33230 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
33240 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d  , (i+1)*sizeof(M
33250 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
33260 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
33270 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
33280 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
33290 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
332a0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
332b0 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d  low;.    if( (i-
332c0 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  -)==0 ) break;..
332d0 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d      if( i+nxDiv=
332e0 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c  =pParent->aiOvfl
332f0 5b 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  [0] && pParent->
33300 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
33310 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50     apDiv[i] = pP
33320 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d  arent->apOvfl[0]
33330 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
33340 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
33350 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
33360 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
33370 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
33380 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  ]);.      pParen
33390 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  t->nOverflow = 0
333a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
333b0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
333c0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
333d0 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
333e0 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >nOverflow);.   
333f0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
33400 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
33410 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
33420 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
33430 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a  nt, apDiv[i]);..
33440 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68        /* Drop th
33450 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20  e cell from the 
33460 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44  parent page. apD
33470 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e  iv[i] still poin
33480 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  ts to.      ** t
33490 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74  he cell within t
334a0 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20  he parent, even 
334b0 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65  though it has be
334c0 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20  en dropped..    
334d0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66    ** This is saf
334e0 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69  e because droppi
334f0 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f  ng a cell only o
33500 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69  verwrites the fi
33510 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
33520 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61  r bytes of it, a
33530 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
33540 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
33550 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
33560 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
33570 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
33580 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  . So the pointer
33590 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a   is safe to use.
335a0 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f        ** later o
335b0 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  n.  .      **.  
335c0 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69      ** But not i
335d0 66 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75  f we are in secu
335e0 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20  re-delete mode. 
335f0 49 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  In secure-delete
33600 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20   mode,.      ** 
33610 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72  the dropCell() r
33620 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72  outine will over
33630 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65  write the entire
33640 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65   cell with zeroe
33650 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  s..      ** In t
33660 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72  his case, tempor
33670 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63  arily copy the c
33680 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76  ell into the aOv
33690 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  flSpace[].      
336a0 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69  ** buffer. It wi
336b0 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  ll be copied out
336c0 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61   again as soon a
336d0 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62  s the aSpace[] b
336e0 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  uffer.      ** i
336f0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f  s allocated.  */
33700 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
33710 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
33720 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
33730 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
33740 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ;..        iOff 
33750 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
33760 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20  INT(apDiv[i]) - 
33770 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
33780 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  T(pParent->aData
33790 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
337a0 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28  iOff+szNew[i])>(
337b0 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
337c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
337d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
337e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
337f0 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
33800 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
33810 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
33820 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
33830 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
33840 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33850 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
33860 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d  aOvflSpace[iOff]
33870 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65  , apDiv[i], szNe
33880 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  w[i]);.         
33890 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
338a0 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
338b0 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
338c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
338d0 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65    }.      dropCe
338e0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
338f0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
33900 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d  erflow, szNew[i]
33910 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
33920 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
33930 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
33940 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
33950 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
33960 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
33970 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
33980 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
33990 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
339a0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
339b0 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
339c0 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
339d0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
339e0 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
339f0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
33a00 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
33a10 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
33a20 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
33a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
33a40 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
33a50 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
33a60 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
33a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
33a80 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
33a90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
33aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
33ac0 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
33ad0 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
33ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b00 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
33b10 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
33b20 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
33b30 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
33b40 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
33b50 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
33b60 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
33b70 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
33b80 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
33b90 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
33ba0 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
33bb0 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
33bc0 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
33bd0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
33be0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
33bf0 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
33c00 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
33c10 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
33c20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
33c30 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
33c40 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
33c50 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
33c60 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
33c70 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
33c80 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
33c90 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
33ca0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
33cb0 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
33cc0 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69  nd remove the di
33cd0 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
33ce0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
33cf0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
33d00 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
33d10 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
33d20 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
33d30 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
33d40 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
33d50 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
33d60 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
33d70 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
33d80 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
33d90 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
33da0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
33db0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
33dc0 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
33dd0 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
33de0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
33df0 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
33e00 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
33e10 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
33e20 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
33e30 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
33e40 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
33e50 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
33e60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
33e70 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
33e80 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
33e90 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
33ea0 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
33eb0 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
33ec0 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
33ed0 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
33ee0 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
33ef0 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
33f00 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
33f10 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61   = apOld[0]->lea
33f20 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
33f30 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44  = apOld[0]->hasD
33f40 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ata;.  for(i=0; 
33f50 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
33f60 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
33f70 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
33f80 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
33f90 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
33fa0 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
33fb0 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
33fc0 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
33fd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
33fe0 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
33ff0 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
34000 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
34010 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
34020 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
34030 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
34040 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
34050 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
34060 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
34070 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
34080 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
34090 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
340a0 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
340b0 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
340c0 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
340d0 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
340e0 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
340f0 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
34100 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
34110 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
34120 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
34130 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
34140 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
34150 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
34160 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
34170 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
34180 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
34190 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
341a0 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
341b0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
341c0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
341d0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
341e0 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
341f0 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
34200 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
34210 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
34220 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
34230 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
34240 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
34250 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
34260 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d       u8 *aData =
34270 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20   pOld->aData;.  
34280 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65      u16 maskPage
34290 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67   = pOld->maskPag
342a0 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c  e;.      u16 cel
342b0 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e  lOffset = pOld->
342c0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
342d0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
342e0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
342f0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
34300 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
34310 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
34320 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28  l] = findCellv2(
34330 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c  aData, maskPage,
34340 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b   cellOffset, j);
34350 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
34360 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
34370 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
34380 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
34390 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
343a0 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20    }.    }       
343b0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
343c0 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
343d0 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
343e0 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
343f0 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
34400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
34410 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
34420 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
34430 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
34440 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
34450 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
34460 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
34470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
34480 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
34490 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
344a0 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20  ert( iSpace1 <= 
344b0 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
344c0 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
344d0 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
344e0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
344f0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
34500 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
34510 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
34520 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
34530 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
34540 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
34550 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
34560 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
34570 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
34580 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
34590 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
345a0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
345b0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
345c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
345d0 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
345e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
345f0 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
34600 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
34610 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
34620 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
34630 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
34640 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
34650 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
34660 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
34670 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
34680 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
34690 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
346a0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
346b0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
346c0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
346d0 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
346e0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
346f0 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
34700 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
34710 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
34720 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
34730 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
34740 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
34750 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
34760 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
34770 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
34780 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
34790 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
347a0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
347b0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
347c0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
347d0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
347e0 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
347f0 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
34800 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
34810 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
34820 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
34830 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
34840 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
34850 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
34860 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
34870 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
34880 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
34890 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
348a0 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
348b0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
348c0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
348d0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
348e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
348f0 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
34900 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
34910 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
34920 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
34930 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
34940 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
34950 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
34960 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
34970 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
34980 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
34990 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
349a0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
349b0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
349c0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
349d0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
349e0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
349f0 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
34a00 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
34a10 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
34a20 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
34a30 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
34a40 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
34a50 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
34a60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
34a70 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
34a80 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
34a90 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
34aa0 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
34ab0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
34ac0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
34ad0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
34ae0 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
34af0 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
34b00 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
34b10 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
34b20 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
34b30 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
34b40 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
34b50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34b60 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
34b70 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
34b80 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
34b90 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
34ba0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
34bb0 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
34bc0 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
34bd0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
34be0 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
34bf0 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
34c00 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
34c10 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
34c20 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
34c30 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
34c40 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
34c50 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
34c60 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
34c70 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
34c80 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
34c90 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
34ca0 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
34cb0 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
34cc0 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
34cd0 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
34ce0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
34cf0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
34d00 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
34d10 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
34d20 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
34d30 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
34d40 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
34d50 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
34d60 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
34d70 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
34d80 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
34d90 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
34da0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
34db0 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
34dc0 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
34dd0 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
34de0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
34df0 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
34e00 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
34e10 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
34e20 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
34e30 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
34e40 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
34e50 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
34e60 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
34e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34e80 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
34e90 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
34ea0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
34eb0 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
34ec0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
34ed0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
34ee0 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
34ef0 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
34f00 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
34f10 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
34f20 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
34f30 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
34f40 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
34f50 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
34f60 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
34f70 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20  szRight==0 .    
34f80 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26     || (!bBulk &&
34f90 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
34fa0 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
34fb0 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20  Cell[r]+2)) .   
34fc0 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
34fd0 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
34fe0 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
34ff0 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
35000 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
35010 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
35020 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
35030 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
35040 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
35050 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
35060 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
35070 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
35080 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
35090 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
350a0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
350b0 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
350c0 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
350d0 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
350e0 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
350f0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
35100 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
35110 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
35120 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
35130 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
35140 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
35150 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20  **.  ** UPDATE: 
35160 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
35170 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  low is not neces
35180 73 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74  sarily true if t
35190 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
351a0 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
351b0 2e 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f  .  The corruptio
351c0 6e 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74  n will be detect
351d0 65 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20  ed and reported 
351e0 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68  later.  ** in th
351f0 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20  is procedure so 
35200 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
35210 20 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20   to act upon it 
35220 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a  now..  */.#if 0.
35230 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
35240 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
35250 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
35260 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
35270 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52   );.#endif..  TR
35280 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
35290 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
352a0 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
352b0 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
352c0 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
352d0 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
352e0 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
352f0 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
35300 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
35310 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
35320 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
35330 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
35340 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
35350 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
35360 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
35370 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35380 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
35390 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
353a0 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
353b0 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
353c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
353d0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
353e0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
353f0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
35400 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
35410 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
35420 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
35430 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35440 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
35450 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
35460 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
35470 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
35480 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
35490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
354a0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
354b0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
354c0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
354d0 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
354e0 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e  (bBulk ? 1 : pgn
354f0 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  o), 0);.      if
35500 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
35510 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
35520 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
35530 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
35540 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
35550 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
35560 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
35570 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
35580 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
35590 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
355a0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
355b0 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
355c0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
355d0 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
355e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
355f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35600 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
35610 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
35620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35630 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
35640 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
35650 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
35660 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
35670 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
35680 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
35690 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f      freePage(apO
356a0 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ld[i], &rc);.   
356b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
356c0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
356d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
356e0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
356f0 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
35700 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
35710 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
35720 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
35730 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
35740 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
35750 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
35760 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
35770 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
35780 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
35790 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
357a0 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
357b0 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
357c0 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
357d0 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
357e0 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
357f0 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
35800 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
35810 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
35820 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
35830 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
35840 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
35850 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
35860 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
35870 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
35880 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
35890 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
358a0 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
358b0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
358c0 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
358d0 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
358e0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
358f0 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
35900 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
35910 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
35920 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
35930 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
35940 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
35950 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
35960 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  o;.    int minI 
35970 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
35980 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
35990 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a       if( apNew[j
359a0 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65  ]->pgno<(unsigne
359b0 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
359c0 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
359d0 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77      minV = apNew
359e0 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [j]->pgno;.     
359f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
35a00 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
35a10 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
35a20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
35a30 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
35a40 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
35a50 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
35a60 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
35a70 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
35a80 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
35a90 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
35aa0 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
35ab0 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
35ac0 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
35ad0 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
35ae0 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
35af0 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
35b00 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
35b10 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
35b20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
35b30 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
35b40 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
35b50 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
35b60 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
35b70 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
35b80 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
35b90 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
35ba0 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
35bb0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
35bc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35bd0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
35be0 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
35bf0 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
35c00 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
35c10 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
35c20 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
35c30 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
35c40 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
35c50 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
35c60 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
35c70 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
35c80 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
35c90 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
35ca0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
35cb0 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
35cc0 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
35cd0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
35ce0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
35cf0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
35d00 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
35d10 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
35d20 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
35d30 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
35d40 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
35d50 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
35d60 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
35d70 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
35d80 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
35d90 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
35da0 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
35db0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
35dc0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
35dd0 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
35de0 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
35df0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
35e00 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
35e10 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
35e20 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
35e30 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
35e40 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
35e50 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
35e60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
35e70 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c  sert( i<nNew-1 |
35e80 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  | j==nCell );.  
35e90 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b    if( j<nCell ){
35ea0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
35eb0 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
35ec0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
35ed0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
35ee0 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
35ef0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
35f00 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
35f10 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
35f20 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
35f30 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f       pTemp = &aO
35f40 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70  vflSpace[iOvflSp
35f50 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ace];.      if( 
35f60 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
35f70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
35f80 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
35f90 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
35fa0 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
35fb0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
35fc0 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
35fd0 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
35fe0 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
35ff0 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
36000 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
36010 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
36020 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
36030 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
36040 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
36050 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
36060 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
36070 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
36080 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
36090 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
360a0 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
360b0 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
360c0 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
360d0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
360e0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
360f0 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72  j--;.        btr
36100 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
36110 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
36120 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
36130 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
36140 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
36150 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
36160 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
36170 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
36180 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
36190 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
361a0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
361b0 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
361c0 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
361d0 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
361e0 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
361f0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
36200 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
36210 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
36220 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
36230 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
36240 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
36250 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
36260 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
36270 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
36280 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43  (see btreeParseC
36290 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
362a0 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
362b0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
362c0 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
362d0 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
362e0 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
362f0 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
36300 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
36310 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
36320 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
36330 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
36340 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
36350 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
36360 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
36370 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
36380 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
36390 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
363a0 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
363b0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
363c0 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
363d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
363e0 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
363f0 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
36400 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
36410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
36420 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
36430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
36440 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
36450 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
36460 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
36470 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
36480 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
36490 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66      }.      iOvf
364a0 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  lSpace += sz;.  
364b0 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
364c0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
364d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
364e0 28 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20  ( iOvflSpace <= 
364f0 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
36500 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65  ze );.      inse
36510 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
36520 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
36530 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70  , pTemp, pNew->p
36540 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
36550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36560 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
36570 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
36580 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36590 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
365a0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
365b0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
365c0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
365d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
365e0 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
365f0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
36600 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
36610 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
36620 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
36630 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
36640 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
36650 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
36660 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
36670 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
36680 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
36690 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
366a0 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
366b0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
366c0 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
366d0 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
366e0 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
366f0 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
36700 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
36710 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
36720 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
36730 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
36740 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
36750 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
36760 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
36770 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
36780 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
36790 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
367a0 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
367b0 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
367c0 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
367d0 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
367e0 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
367f0 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
36800 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
36810 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
36820 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
36830 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
36840 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
36850 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
36860 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
36870 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
36880 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
36890 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
368a0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
368b0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
368c0 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
368d0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
368e0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
368f0 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
36900 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
36910 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
36920 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
36930 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
36940 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
36950 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
36960 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
36970 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
36980 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
36990 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
369a0 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
369b0 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
369c0 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
369d0 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
369e0 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
369f0 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
36a00 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
36a10 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
36a20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
36a30 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
36a40 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
36a50 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
36a60 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
36a70 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
36a80 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
36a90 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
36aa0 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
36ab0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
36ac0 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65  (apNew[0], pPare
36ad0 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72  nt, &rc);.    fr
36ae0 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c  eePage(apNew[0],
36af0 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69   &rc);.  }else i
36b00 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
36b10 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68  ){.    /* Fix th
36b20 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
36b30 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
36b40 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
36b50 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
36b60 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  . .    ** There 
36b70 61 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66  are several diff
36b80 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70  erent types of p
36b90 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
36ba0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  es that need to.
36bb0 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
36bc0 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75  with by this rou
36bd0 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68  tine. Some of th
36be0 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65  ese have been se
36bf0 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20  t already, but. 
36c00 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20     ** many have 
36c10 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  not. The followi
36c20 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a  ng is a summary:
36c30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
36c40 20 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20   1) The entries 
36c50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
36c60 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
36c70 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a  s that were not.
36c80 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c      **      sibl
36c90 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66  ings when this f
36ca0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
36cb0 65 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61  ed. These have a
36cc0 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20  lready.    **   
36cd0 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20     been set. We 
36ce0 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f  don't need to wo
36cf0 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69  rry about old si
36d00 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
36d10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  .    **      mov
36d20 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
36d30 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
36d40 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
36d50 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  ken care.    ** 
36d60 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20       of those.. 
36d70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32     **.    **   2
36d80 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  ) The pointer-ma
36d90 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
36da0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
36db0 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  rst overflow.   
36dc0 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e   **      page in
36dd0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68   any overflow ch
36de0 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77  ains used by new
36df0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20   divider cells. 
36e00 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20  These .    **   
36e10 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72     have also alr
36e20 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20  eady been taken 
36e30 63 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69  care of by the i
36e40 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65  nsertCell() code
36e50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
36e60 20 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c    3) If the sibl
36e70 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
36e80 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
36e90 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f  he child pages o
36ea0 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65  f.    **      ce
36eb0 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
36ec0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
36ed0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
36ee0 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
36ef0 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68     **   4) If th
36f00 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
36f10 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c  are not internal
36f20 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74   intkey nodes, t
36f30 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20  hen any.    **  
36f40 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
36f50 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65  es used by these
36f60 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20   cells may need 
36f70 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20  to be updated.  
36f80 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72    **      (inter
36f90 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
36fa0 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70   never contain p
36fb0 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66  ointers to overf
36fc0 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20  low pages)..    
36fd0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49  **.    **   5) I
36fe0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
36ff0 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
37000 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  es, then the poi
37010 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
37020 20 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72       entries for
37030 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
37040 20 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73   pages of each s
37050 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a  ibling may need.
37060 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62      **      to b
37070 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
37080 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31  *.    ** Cases 1
37090 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74   and 2 are dealt
370a0 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f   with above by o
370b0 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e  ther code. The n
370c0 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
370d0 20 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65   deals with case
370e0 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68  s 3 and 4 and th
370f0 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74  e one after that
37100 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a  , case 5. Since.
37110 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
37120 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
37130 72 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65  ry is a relative
37140 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  ly expensive ope
37150 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20  ration, this.   
37160 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65   ** code only se
37170 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  ts pointer map e
37180 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64  ntries for child
37190 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
371a0 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
371b0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76   ** actually mov
371c0 65 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73  ed between pages
371d0 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
371e0 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
371f0 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
37200 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
37210 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
37220 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
37230 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
37240 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
37250 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
37260 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
37270 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
37280 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66  ow ? pOld->aiOvf
37290 6c 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20  l[0] : -1);.    
372a0 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
372b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372c0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f     /* Current 'o
372d0 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ld' sibling page
372e0 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20   */.    k = 0;  
372f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
37310 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c  rrent 'new' sibl
37320 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
37330 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
37340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
37350 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
37360 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
37370 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
37380 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
37390 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
373a0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
373b0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
373c0 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
373d0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
373e0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
373f0 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
37400 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
37410 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
37420 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
37430 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
37440 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ll. */.        a
37450 73 73 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72  ssert( j+1 < Arr
37460 61 79 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29  aySize(apCopy) )
37470 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37480 28 20 6a 2b 31 20 3c 20 6e 4f 6c 64 20 29 3b 0a  ( j+1 < nOld );.
37490 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61          pOld = a
374a0 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20  pCopy[++j];.    
374b0 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69      iNextOld = i
374c0 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
374d0 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c  Old->nCell + pOl
374e0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
374f0 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
37500 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
37510 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77         nOverflow
37520 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
37530 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ow;.          iO
37540 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c  verflow = i + !l
37550 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
37560 61 69 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20  aiOvfl[0];.     
37570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44     }.        isD
37580 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61  ivider = !leafDa
37590 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ta;  .      }.. 
375a0 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
375b0 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72  rflow>0 || iOver
375c0 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20  flow<i );.      
375d0 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
375e0 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76  <2 || pOld->aiOv
375f0 66 6c 5b 30 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f  fl[0]==pOld->aiO
37600 76 66 6c 5b 31 5d 2d 31 29 3b 0a 20 20 20 20 20  vfl[1]-1);.     
37610 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
37620 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f  w<3 || pOld->aiO
37630 76 66 6c 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69  vfl[1]==pOld->ai
37640 4f 76 66 6c 5b 32 5d 2d 31 29 3b 0a 20 20 20 20  Ovfl[2]-1);.    
37650 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c    if( i==iOverfl
37660 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ow ){.        is
37670 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20  Divider = 1;.   
37680 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65       if( (--nOve
37690 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20  rflow)>0 ){.    
376a0 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b        iOverflow+
376b0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
376c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
376d0 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a  i==cntNew[k] ){.
376e0 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
376f0 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
37700 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
37710 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
37720 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20  l on new.       
37730 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
37740 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   k. If the sibli
37750 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
37760 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
37770 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
37780 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
37790 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20   i is a divider 
377a0 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cell.  */.      
377b0 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b    pNew = apNew[+
377c0 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +k];.        if(
377d0 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e   !leafData ) con
377e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
377f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
37800 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
37810 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
37820 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
37830 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
37840 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
37850 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
37860 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
37870 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
37880 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
37890 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
378a0 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
378b0 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
378c0 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
378d0 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
378e0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
378f0 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
37900 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
37910 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
37920 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
37930 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
37940 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
37950 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
37960 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
37970 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
37980 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
37990 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
379a0 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
379b0 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
379c0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
379d0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
379e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
379f0 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
37a00 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
37a10 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
37a20 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
37a30 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
37a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37a50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
37a60 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
37a70 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
37a80 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
37a90 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
37aa0 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
37ab0 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
37ac0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
37ad0 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
37ae0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
37af0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
37b00 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
37b10 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
37b20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
37b30 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
37b40 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
37b50 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
37b60 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
37b70 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
37b80 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
37b90 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
37ba0 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
37bb0 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
37bc0 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
37bd0 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
37be0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
37bf0 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
37c00 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
37c10 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
37c20 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
37c30 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
37c40 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
37c50 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
37c60 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
37c70 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
37c80 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
37c90 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
37ca0 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
37cb0 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
37cc0 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
37cd0 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
37ce0 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
37cf0 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
37d00 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
37d10 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
37d20 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
37d30 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
37d40 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
37d50 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
37d60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
37d70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
37d80 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
37d90 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
37da0 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
37db0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
37dc0 63 3b 0a 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  c;.}.#if defined
37dd0 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
37de0 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26  SC_VER >= 1700 &
37df0 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  & defined(_M_ARM
37e00 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69  ).#pragma optimi
37e10 7a 65 28 22 22 2c 20 6f 6e 29 0a 23 65 6e 64 69  ze("", on).#endi
37e20 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f.../*.** This f
37e30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
37e40 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20  d when the root 
37e50 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
37e60 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a   structure is.**
37e70 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f   overfull (has o
37e80 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
37e90 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a  low pages)..**.*
37ea0 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61  * A new child pa
37eb0 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ge is allocated 
37ec0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
37ed0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
37ee0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e  root.** page, in
37ef0 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77  cluding overflow
37f00 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69   cells, are copi
37f10 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c  ed into the chil
37f20 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  d. The root.** p
37f30 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72  age is then over
37f40 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20  written to make 
37f50 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  it an empty page
37f60 20 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d   with the right-
37f70 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65  child .** pointe
37f80 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
37f90 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a  e new page..**.*
37fa0 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
37fb0 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ng, all pointer-
37fc0 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
37fd0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
37fe0 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  es .** that the 
37ff0 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e  new child-page n
38000 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  ow contains poin
38010 74 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61  ters to are upda
38020 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72  ted. The.** entr
38030 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  y corresponding 
38040 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74  to the new right
38050 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
38060 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  f the root.** pa
38070 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  ge is also updat
38080 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
38090 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c  cessful, *ppChil
380a0 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74  d is set to cont
380b0 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
380c0 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a  to the child .**
380d0 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45   page and SQLITE
380e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
380f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
38100 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75  e caller is requ
38110 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20  ired.** to call 
38120 72 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e  releasePage() on
38130 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c   *ppChild exactl
38140 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72  y once. If an er
38150 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61  ror occurs,.** a
38160 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
38170 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
38180 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
38190 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
381a0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
381b0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20  MemPage *pRoot, 
381c0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c  MemPage **ppChil
381d0 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  d){.  int rc;   
381e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
38200 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
38210 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
38220 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30  Page *pChild = 0
38230 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
38240 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
38250 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
38260 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d  Pgno pgnoChild =
38270 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
38280 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
38290 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
382a0 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
382b0 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e  d *pBt = pRoot->
382c0 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42  pBt;    /* The B
382d0 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  Tree */..  asser
382e0 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  t( pRoot->nOverf
382f0 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  low>0 );.  asser
38300 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
38310 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
38320 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ) );..  /* Make 
38330 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20  pRoot, the root 
38340 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
38350 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c  ee, writable. Al
38360 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20  locate a new .  
38370 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ** page that wil
38380 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
38390 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
383a0 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20  pPage. Copy the 
383b0 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  contents.  ** of
383c0 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64   the node stored
383d0 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74   on pRoot into t
383e0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
383f0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
38400 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
38410 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
38420 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
38430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
38440 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
38450 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c  age(pBt,&pChild,
38460 26 70 67 6e 6